我有一个像这样的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篡改。
这可能是什么问题?
答案 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模型