我有一个像这样的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/