MVC 4似乎无法解析我发送的对象。
使用jQuery的ajax函数,我使用POST请求发送数据。我在Request对象中收到它,它在Request.Form中显示如下:
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults)
{Name=Test&Groups%5b0%5d%5bName%5d=GroupName1&Groups%5b0%5d%5bCount%5d=123Groups%5b1%5d%5bName%5d=GroupName2&Groups%5b1%5d%5bCount%5d=123ID=bee4c411-f06c-43c6-815f-8002df4f2779}
//formatted for readability
Name=Test &
Groups[0][Name]=GroupName1 &
Groups[0][Count]=123 &
Groups[1][Name]=GroupName2 &
Groups[1][Count]=123 &
ID=bee4c411-f06c-43c6-815f-8002df4f2779
和Name
值被解析得很好,但是Groups数组不是......我得到一个ID
,它包含正确数量的组但是其中的值为IEnumerable
。
我看过this和this而我似乎无法找到我做错的事情......
我缺少什么?
MVC null
看起来像这样:
Action
和public ActionResult UpdateGroups(GroupsListRequest req)
{
[...] //handle the request
}
看起来像这样:
GroupsListRequest
最后,public class GroupsListRequest
{
public string Name { get; set; }
public string ID { get; set; }
public IEnumerable<GroupRequest> Groups { get; set; }
}
看起来像这样:
GroupsRequest
答案 0 :(得分:1)
试试这个
删除请求中名称和计数字段周围的方括号。
Name:Test &
Groups[0].Name:GroupName1 &
Groups[0].Count:123 &
Groups[1].Name:GroupName2 &
Groups[1].Count:123 &
ID:bee4c411-f06c-43c6-815f-8002df4f2779
您的输入名称应该是这样的
<input type="text" name="Groups[0].Name" value="George" />
答案 1 :(得分:0)
所以,正如@sangramparmar和@stephenmuecke所提到的那样,问题在于数组中对象的格式 - 它们被一对额外的括号所包围。
有几种情况使这个问题得到解决:
param
函数是通过错误地解析数组导致问题的函数(至少就C#的MVC而言ajaxSetup
contentType
设置为application/json
时,MVC无法读取ajax请求的数据(至少,未按照我期望的方式读取它)。如果我从未学过任何东西,可能会以某种方式误导。我最终使用的解决方案是构建我自己的stringify
函数来将数据对象解析为字符串,如下所示:
stringify: function (obj, prefix) {
var objString = '';
prefix = prefix || '';
if(typeof(obj) === 'object') {
if (Array.isArray(obj)) {
_.each(obj, function (item, index) {
objString = objString + utilityMethods.stringify(item, prefix + '%5b' + index + '%5d');
});
} else {
if (prefix != undefined && prefix.length !== 0) {
prefix = prefix + '.';
}
_.each(_.keys(obj), function (key) {
objString = objString + utilityMethods.stringify(obj[key], prefix + key);
});
}
} else {
objString = objString + '&' + prefix + '=' + obj;
}
return objString;
}
然后,在全球ajaxSetup
中,我添加了beforeSend
来添加所需的密钥,如下所示:
beforeSend: function (jqXHR, settings) {
var userKeyString = 'userKey=' + [... fetch the user key...];
if (settings.type.toUpperCase() === 'GET') {
settings.url = settings.url + '&' + userKeyString;
} else {
if (settings.data != undefined) {
settings.data = userKeyString + '&' + settings.data;
}
}
},
现在,我最终会在每个请求中添加额外的&符号。我最终会解决这个问题......也许。