我有一个像这样的json对象:

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


我使用jQuery这样发布它:

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


当调用到达我的ASP.NET MVC4控制器操作时,将分配非列表属性。但是,translations数组只有两个空对象(已实例化,但具有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的篡改。

这可能是什么问题?

最佳答案

您应该指定内容类型(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方法中

article可能对您有帮助。

关于c# - 为什么Modelbinder在ASP.NET MVC4中为我的列表实例化空对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17678673/

10-12 00:29