Ajax调用是传递控制器名称和方法名称而不是数据

时间:2016-01-20 18:11:17

标签: c# jquery asp.net ajax asp.net-mvc

我的ajax调用遇到了麻烦。这是控制器代码:

[Route("RatingInfo/HandleRequest")]
[HttpPost]
public ActionResult HandleRequest(Dictionary<string, string> textBoxValues)
{
    var result = CreateJson(textBoxValues); // This is a simplified example

    return Json(result);
}

这是我的Jquery / ajax(Razor语法):

function PassData () {
    var data = {};
    $('.divCell input').each(function (index, item) {
        var id = $(item).attr('id');
        var value = item.value;
        data['dictionary[' + index + '].Key'] = id;
        data['dictionary[' + index + '].Value'] = value;
    });

    $.ajax({
        url: '@Url.Action("HandleRequest")',
        type: 'POST',
        dataType: 'JSON',
        traditional: true,
        data: data,
        sucesss: function (result) {
            alert('Success');
        }
    })
}

这里的想法是从每个文本框中获取数据并将其作为字典传递回服务器,其中id为键,值为值。

单步浏览Chrome调试器,可以成功构建JS数据对象。

来自调试器:

 Local
 data: Object
 dictionary[0].Key: "Address"
 dictionary[0].Value: "123 Main St"
 dictionary[1].Key: "ZipCode"
 dictionary[1].Value: "99999"
 dictionary[2].Key: "Phone1"
 dictionary[2].Value: "(555) 555-5555"
 ...
__proto__: Object

但是,当数据传回控制器时,textBoxValues中的值不包含传递的数据。相反,它包含两个带键控制器和操作的键/值对,并且值为控制器和操作的名称。

从Visual Studio调试器:

 textBoxValues = Count = 2
 [0] = {[controller, RatingInfo]}
 [1] = {[action, HandleRequest]}

如何让Jquery传递数据而不是控制器/动作名称?我很困惑,这首先是如何发生的。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

更新

抱歉,我输错了代码。

这不起作用的原因是因为参数的名称不正确,导致您不匹配。

以下内容适合您。请注意,dictionary的名称已更改为您的参数textBoxValues

function PassData() {
    var data = {};

    $('.divCell input').each(function (index, item) {
        var id = $(item).attr('id');
        var value = item.value;
        data['textBoxValues[' + index + '].Key'] = id;
        data['textBoxValues[' + index + '].Value'] = value;
    });

    $.ajax({
        url: '@Url.Action("HandleRequest")',
        type: 'POST',
        traditional: true,
        data: data,
        sucesss: function (result) {
            alert('Success');
        }
    })
}