MVC没有在请求中解析IEnumerable值

时间:2016-04-14 09:04:47

标签: c# asp.net-mvc-4

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

我看过thisthis而我似乎无法找到我做错的事情......

我缺少什么?

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

2 个答案:

答案 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所提到的那样,问题在于数组中对象的格式 - 它们被一对额外的括号所包围。

有几种情况使这个问题得到解决:

  • 我使用jQuery将请求发送到服务器,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;
        }
    }
},

现在,我最终会在每个请求中添加额外的&符号。我最终会解决这个问题......也许。