为什么modelbinder在ASP.NET MVC4中为我的列表实例化空对象?

时间:2013-07-16 14:02:26

标签: c# asp.net json asp.net-mvc-4 model-binding

我有一个像这样的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 / default属性值)。这是我的控制器动作方法和我的模型:

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篡改。

这可能是什么问题?

3 个答案:

答案 0 :(得分: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方法中

article可能会对您有所帮助。

答案 1 :(得分:1)

当您为Ajax传递数据时,最好指定内容并对数据进行字符串输入:

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

然后值提供者和默认的ModelBinder将完成这项工作。

答案 2 :(得分:0)

我可以看到json对象属性不匹配.net属性,在json中你在.net中有“值”“值”的情况不同。尝试使案例进入.net模型