2016-08-09 70 views
1

我試圖對我的Web API進行PUT調用。我在WebApiConfig.cs中設置了以下內容來處理在駝峯案例中將數據發送回我的Web項目。Web API 2.0接收帶有pascal case的駝峯式JSON數據

config.Formatters.JsonFormatter.SerializerSettings.ContractResolver 
    = new CamelCasePropertyNamesContractResolver(); 

我的數據來自Kendo UI Grid中的一行。使Ajax調用的JavaScript低於:

...  
    save: function(e) { 
     var dataItem = e.model; 
     $.ajax({ 
      url: apiUrl() + "/roleLocationSecurable", 
      type: 'PUT', 
      headers: { 
       'Authorization': 'Bearer ' + getTwtToken(), 
       'LocationId': getCurrentLocation() 
      }, 
      data: JSON.stringify(dataItem), 
      dataType: 'json' 
     }).done(function(data){ 
      //stuff when finished 
     }); 
    } 
... 

的數據被髮送到Web API看起來是這樣的:

"id":1, 
"roleLocationId":5 
"moduleId":5 
... 

上我的Web API 2.0控制器的操作是這樣的:

[HttpPut] 
[Route("roleLocationSecurable") 
public IHttpActionResult UpdateRoleLocationSecurable(RoleLocationSecurableResource model) 
{ 
    var roleLocationSecurable = Mapper.Map<RoleLocationSecurableResource, RoleLocationSecurable>(model); 
    if(_roleService.UpdateRoleLocationSecurable(roleLocationSecurable)) 
    { 
     return Ok(); 
    } 
    return NotFound(); 
} 

我的控制器預期模型中有一個名爲像這樣的性質:

public int? Id {get;set;} 
public int RoleLocationId {get;set;} 
public int ModuleId {get;set;} 
.... 

發生了什麼事是我的Ajax調用正在觸發,我的PUT調用的主體包含了來自上面的所有信息以及駱駝事件鍵。正在調用Web API控制器,但我的模型中的值沒有填充任何內容(模型基本上是空白的)。

我認爲我有問題(也許我錯了)是我的Web API控制器上的Action期望Pascal Case屬性,並且我的Ajax調用正在發送Camel Case。

由於CameCasePropertyNamesContractResolver正在處理將數據序列化爲駱駝的情況,爲什麼它不處理反序列化?有沒有簡單,簡單的方法來解決這個問題?

任何幫助,爲什麼上面的代碼不工作將​​不勝感激。

+0

我忘了提,我去看,發現這個問題是類似的,但從來沒有回答:http://stackoverflow.com/questions/34364562/camel-cased-json-net-deserialization-from-web-api - 請求 – Anna

+0

你從未提及實際發生的事情。傳入的參數是否爲空?它從來沒有達到你的方法?客戶端實際發送了什麼,您在瀏覽器調試控制檯中找到了什麼? – Igor

+0

好點@Igor。發佈更新以包含此信息。 – Anna

回答

1

它看起來像你在ajax調用中缺少contentType:「application/json」。爲了使Web API正確處理內容協商和模型綁定,它必須知道正在傳遞什麼內容類型。不告訴Web API什麼是內容類型,它無法將內容映射到模型,從而在Action中將其顯示爲空。下面是你的代碼段更新:

$.ajax({ 
    url: getApiUrl() + "/roleLocationSecurable", 
    type: 'PUT', 
    headers: { 
     'Authorization': 'Bearer ' + getJwtToken(), 
     'LocationId': getCurrentLocation() 
    }, 
    data: dataItem, 
    dataType: "json", 
    **contentType: "application/json"** 
})... 

我能夠測試這個,我看到一個人口稠密的模型。

+0

我也能夠測試這個,我看到一個人口稠密的模型。活泉。 – Anna

0

您是否嘗試使用JsonProperty註釋您的模型屬性。例如這樣的:

[JsonProperty("Id")] 
public int? Id {get;set;} 

[JsonProperty("RoleLocationId ")] 
public int RoleLocationId {get;set;} 

[JsonProperty("ModuleId ")] 
public int ModuleId {get;set;} 

記住調用此組件:using Newtonsoft.Json;

+1

感謝您的回答。我希望找到一個解決方案,而無需在我的模型上註明每個屬性的更新。接受的答案實現了這一點。 – Anna

0
services 
    .AddMvc() 
    .AddJsonOptions(options => 
    { 
     options.SerializerSettings.ContractResolver 
      = new Newtonsoft.Json.Serialization.DefaultContractResolver(); 
    }); 

添加到您的Startup.cs如果您使用.NET的核心項目,它會保持相同的.NET類圖書館。