2014-09-01 20 views
0

我正在實施ODataController。它的OData V3由於兼容性原因,與Breeze.js無法在OData控制器中序列化爲Delta <>

using System.Web.Http.OData; 
public class OffersController : ODataMetadataController 
{ 
    ... 

Somwhere在我想要實現合併/補丁所看到的例子中:

[AcceptVerbs("PATCH", "MERGE")] 
public IHttpActionResult Patch([FromODataUri] int key, Delta<BOOffer> delta) 
{ 
    ... 

出於某種原因,我得到了以下錯誤:

​​

好的。 Delta<>與OData相關,我需要一個OData格式化程序。

迭代通過格式化(as on this page),它似乎並沒有成爲一個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)); 

回答

1

這樣做的原因是該項目引用兩個System.Web.Http.OData(odatav3)和System.Web.OData(odatav4)和混合起來引用。

System.Web.Http.OData.Formatter.ODataMediaTypeFormatter未配置爲能夠序列化爲System.Web.OData.Delta<T>

使用到​​按預期工作。

請注意在一個項目中引用不同的OData版本。

相關問題