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

C# 为什么modelbinder在ASP.NET MVC4中为我的列表实例化空对象?,c#,asp.net,json,asp.net-mvc-4,model-binding,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

我有一个json对象,如下所示:

var itemData = {
   "translations":[
      {
         "value":"Byron",
         "languageId":1             
      },
      {
         "value":"hgfdfghds",
         "languageId":3
      }
   ],
   "itemId":204,
   "itemCategoryId":44
};
$.ajax({
    url: "items/update",
    dataType: "json",
    type: "POST",
    data: itemData,
});
我使用jQuery发布它,如下所示:

var itemData = {
   "translations":[
      {
         "value":"Byron",
         "languageId":1             
      },
      {
         "value":"hgfdfghds",
         "languageId":3
      }
   ],
   "itemId":204,
   "itemCategoryId":44
};
$.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; }
}
publicjsonresult更新(UpdateItemModel模型)
{
if(model.Translations[0].Value!=“Byron”)
{
抛出新的异常(“该翻译的值应填充“Byron”);
}
返回Json(“ok”);
}
公共类更新模型
{
公共列表翻译{get;set;}
公共int ItemId{get;set;}
public int ItemCategoryId{get;set;}
}
公共类翻译模型
{
公共字符串值{get;set;}
public int LanguageId{get;set;}
}
如果我查看即时窗口中的
Request.Form
,我可以看到
翻译
“数组”是出于某种原因编码的(可能是正确的,不确定)。如果我尝试
Request.Form[“translations”]
我会得到
null
。下面是我看到的原始表单数据示例:

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

不确定我的问题是否与该字符串开头的json“编码”有关。我在Fiddler中看到了同样的东西,所以我不能因为篡改而责怪ASP.NET


这里可能有什么问题?

我可以看到json对象属性与.net属性不匹配,在json中您有“值”,在.net中“值”的情况不同。试着用.net模型来说明问题

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

您应该指定内容类型(json)并使用

另一件事是使用addaJsonValueProviderFactory

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
Application\u启动
Global.asax中的方法


这可能会对您有所帮助。

您应该指定内容类型(json)并使用

另一件事是使用addaJsonValueProviderFactory

ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());
Application\u启动
Global.asax中的方法


这可能会对您有所帮助。

当您为Ajax传递数据时,可以通过调用指定内容并字符串化数据:

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

然后值提供程序和默认ModelBinder将完成此工作。

当您为Ajax传递数据时,最好指定内容并字符串化数据:

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

然后,值提供程序和默认ModelBinder将完成这项工作。

我希望这不是原因,因为没有其他内容区分大小写,但我会尝试。:)不,同样的问题。我将所有c#属性更改为camel大小写,数组中仍然填充了空对象。我希望这不是原因,因为其他属性都不区分大小写,但我会尝试使用它。:)不,同样的问题。我将所有c#属性更改为camel case,数组中仍然填充了空对象。#1不正确。在ASP.NET MVC中进行modelbinding时,属性名称不区分大小写#2是正确的,我需要contentType和字符串化我的数据。谢谢!我不知道这个变化#1是不正确的。在ASP.NET MVC中进行modelbinding时,属性名称不区分大小写#2是正确的,我需要contentType和字符串化我的数据。谢谢!我不知道这个变化!该问题在未添加jsonValueProviderFactory的情况下得到修复。contentType和字符串化数据就是诀窍。谢谢很高兴我帮了忙。干杯。问题在没有添加jsonValueProviderFactory的情况下得到了解决。contentType和字符串化数据就是诀窍。谢谢很高兴我帮了忙。干杯