我正在实施一个ODataController
. 出于与Breeze.js的兼容性原因,它是 OData V3 :
using System.Web.Http.OData;
public class OffersController : ODataMetadataController
{
...
我想在中间的某个地方实现合并/补丁,如示例中所示:
[AcceptVerbs("PATCH", "MERGE")]
public IHttpActionResult Patch([FromODataUri] int key, Delta<BOOffer> delta)
{
...
出于某种原因,我收到以下错误:
没有 MediaTypeFormatter 可用于从媒体类型为“application/json”的内容中读取“Delta`1”类型的对象。
好的。Delta<>
与 OData 相关,我需要一个 OData 格式化程序。
遍历格式化程序(如本页所示),它似乎不是 OData 格式化程序:
JsonMediaTypeFormatter
CanReadType: True
CanWriteType: True
Base: BaseJsonMediaTypeFormatter
Media Types: application/json, text/json
XmlMediaTypeFormatter
CanReadType: True
CanWriteType: True
Base: MediaTypeFormatter
Media Types: application/xml, text/xml
FormUrlEncodedMediaTypeFormatter
CanReadType: False
CanWriteType: False
Base: MediaTypeFormatter
Media Types: application/x-www-form-urlencoded
JQueryMvcFormUrlEncodedFormatter
CanReadType: True
CanWriteType: False
Base: FormUrlEncodedMediaTypeFormatter
Media Types: application/x-www-form-urlencoded
我应该注册这个格式化程序吗?不应该是自动的吗?如果我需要手动注册,如何注册?
如果我将输入参数表单更改Delta<BOOffer>
为BOOffer
方法被调用,但由于只发送更改的属性,这不是我可以使用的。
我在 app_start 中配置我的控制器,如下所示:
System.Web.Http.OData.Builder.ODataConventionModelBuilder builderV3 = new System.Web.Http.OData.Builder.ODataConventionModelBuilder();
var entitySetConfigV3 = builderV3.EntitySet<BOOffer>("Offers");
entitySetConfigV3.EntityType.HasKey(o => o.ID);
config.Routes.MapODataServiceRoute(
routeName: "odata/v3",
routePrefix: "odata/v3",
model: builderV3.GetEdmModel(),
batchHandler: new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));