2016-08-09 7 views
1

私のWeb APIへのPUT呼び出しを試みています。私はWebApiConfig.csで次のように設定して、ラクダのケースでWebプロジェクトにデータを送り返します。Web API 2.0は、パスカルケースでキャメルケースのJSONデータを受信します。

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

私のデータは、剣道UIグリッドの行から来ています。 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 
... 

私のウェブ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 -request – Anna

+0

あなたは実際に何が起こっているかは言及しません。渡されたパラメータはnullですか?それはあなたの方法に到達することはありませんか?実際にクライアントから送信されているもの、ブラウザのデバッグコンソールで何を見つけましたか? – Igor

+0

良い点@Igor。この情報を含むように更新されました。 – Anna

答えて

1

あなたのajax呼び出しでcontentType: "application/json"が見つからないようです。 Web APIがコンテンツのネゴシエーションとモデルのバインディングを適切に処理するためには、渡されるコンテンツの種類を知る必要があります。コンテンツタイプをWeb APIに伝えなくても、コンテンツをモデルにマップすることはできず、Actionでnullと表示されます。

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

が、私はこれをテストすることができたと私は人口のモデルを参照してください。以下は、スニペットが更新されます。

+0

私もこれをテストすることができました。 Woot。 – 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(); 
    }); 

は、.NETのコアプロジェクトであり、それは、.NETクラスと同じように続ける場合は、あなたのStartup.csにこれを追加しますとしょうかん。

関連する問題