2

次のようなjsonオブジェクトがあります。

var itemData = {
   "translations":[
      {
         "value":"Byron",
         "languageId":1             
      },
      {
         "value":"hgfdfghds",
         "languageId":3
      }
   ],
   "itemId":204,
   "itemCategoryId":44
};

そして、次のように jQuery を使用して POST します。

$.ajax({
    url: "items/update",
    dataType: "json",
    type: "POST",
    data: itemData,
});

呼び出しが ASP.NET MVC4 コントローラー アクションに到達すると、リスト以外のプロパティが割り当てられます。ただし、translations配列には 2 つの空のオブジェクトしかありません (インスタンス化されていますが、null/既定のプロパティ値があります)。これが私のコントローラーアクションメソッドと私のモデルです:

public JsonResult Update(UpdateItemModel model)
{
    if(model.Translations[0].Value!="Byron")
    {
        throw new Exception("That translation's value should have been populated with 'Byron'.");
    }
    return Json("ok");
}

public class UpdateItemModel
{
    public List<TranslationModel> Translations { get; set; }
    public int ItemId { get; set; }
    public int ItemCategoryId { get; set; }
}

public class TranslationModel
{
    public string Value { get; set; }
    public int LanguageId { get; set; }
}

Request.Formイミディエイト ウィンドウを見ると、何らかのtranslations理由で「配列」がエンコードされていることがわかります (おそらく正しいかどうかはわかりません)。試してみるRequest.Form["translations"]と、 が得られnullます。私が見ている生のフォームデータの例を次に示します。

{translations%5b0%5d%5bvalue%5d=Byron&translations%5b0%5d%5blanguageId%5d=1&translations%5b1%5d%5bvalue%5d=hgfdfghds&translations%5b1%5d%5blanguageId%5d=3&itemId=204&itemCategoryId=44}

私の問題が、その文字列の先頭にあるjsonの「エンコーディング」と関係があるかどうかはわかりません。私は Fiddler でそれを見て、同じことを見たので、ASP.NET を改ざんのせいにすることはできません。

ここで何が問題になる可能性がありますか?

4

3 に答える 3

3

コンテンツ タイプ (json) を指定し、JSON.stringifyを使用して文字列化する必要があります。

$.ajax({
    url: "items/update",
    dataType: "json",
    contentType: "application/json; charset=utf-8;",
    type: "POST",
    data: itemData,
    data: JSON.stringify(itemData),
});

他にやるべきことは、JsonValueProviderFactoryを追加することです:

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

Application_StartメソッドでGlobal.asax

この記事が役立つかもしれません。

于 2013-07-16T14:16:43.663 に答える
1

Ajax 呼び出しにデータを渡す場合は、コンテンツを指定してデータを stringfy するのが適切です。

$.ajax({
   /*More stuff*/
   data: JSON.stringify(itemData),
   contentType: 'application/json',
   dataType: "json",
   type: "POST"
});

次に、値プロバイダーとデフォルトの ModelBinder がジョブを実行します。

于 2013-07-16T14:19:53.177 に答える