如何将以下内容传递回mmvc3控制器ActionResult?

var hashtable = {};
hashtable['screaming'] = ["1", "2"];
hashtable['mellow'] = ["3", "4", "5"];
$.get('@Url.Action("PerformMagic")', { 'theValues': hashtable }, function (data) {
    //Callback..
});


我的控制器方法信号会是什么样?

public ActionResult PerformMagic(/*What type goes here? string[] theValues or string[][] theValues)
{
}

最佳答案

如果要将哈希表值传递给操作,最自然的方法是将其作为字典传递给操作

public ActionResult PerformMagic(Dictionary<String, List<int>> theValues)
{
    // the magic!
}


当使用jQuery Ajax功能将值传递给ASP.NET MVC操作时,您会遇到很大的框架误解。 ASP.NET MVC ModelBinder期望使用该命名方案将值绑定到请求正文或URL中的Dictionary

theValues[0].key=key0
theValues[0].value[0]=values0.0
theValues[0].value[1]=values0.1
theValues[1].key=key1
theValues[1].value[0]=values1.0
theValues[1].value[1]=values1.1
theValues[1].value[2]=values1.2


This blog post提供有关字典和列表的ASP.NET MVC命名方案的更多详细信息。

但是jQuery使用这种命名方案在请求正文或URL中传递值

theValues[key0][]=value0.0
theValues[key0][]=value0.1
theValues[key1][]=value1.0
theValues[key1][]=value1.1
theValues[key1][]=value1.2


在两个示例中,我都省略了'&'并将请求值分成不同的行以提高可读性。

因此,如果要将值作为Dictionary传递给action方法,则需要让jQuery和ASP.NET MVC Model Binders对话。我可以想到两种选择:


更改ASP.NET MVC期望请求的命名方案
参数
更改jQuery用于构建的命名方案
请求参数


方法1将要求您编写自己的Model Binder,并且由于绑定到Dictionary动作参数的命名功能隐藏在内部UpdateDictionary方法中,因此编写自己的Model Binder意味着将复制大量ASP.NET MVC DefaultModelBinder代码。 ..

方法2应该相当简单地实现,因为jQuery使用param函数来构建请求参数,而jQuery ajax函数允许您传入由自定义函数转换后的原始值来请求参数。关于jQuery ajax函数的更多细节可以是found here。请参见“ processData”部分。

我将给出一个原型jQuery实现,以将哈希表var作为字典参数传递给ASP.NET MVC控制器动作:

function buildParams(prefix, dict) {
    var s = [],
    add = function (key, value) {
        // If value is a function, invoke it and return its value
        value = jQuery.isFunction(value) ? value() : value;
        s[s.length] = encodeURIComponent(key) + "=" + encodeURIComponent(value);
    };

    var i = 0;

    jQuery.each(dict, function (key, values) {
        add(prefix + '[' + i + '].key', key);

        jQuery.each(values, function (j, value) {
            add(prefix + '[' + i + '].value[' + j + ']', value);
        });

        i++;
    });

    return s.join('&');
}

$(function () {
    $('#submithashes').click(function (e) {
        var hashtable2 = {};
        hashtable2['screaming'] = ["1", "2"];
        hashtable2['mellow'] = ["3", "4", "5"];

        $.ajax({
            type: "POST",
            url: '@Url.Action("PerformMagic")',
            dataType: 'json',
            processData: false,
            data: buildParams('theValues', hashtable2),
            success: function () {

            }
        });

        e.preventDefault();
    });
});


这个原型实现中有趣的部分是它使用POST,它使用的是jQuery ajax,而不是$ .get或$ .post快捷方式,因为这些快捷方式不会暴露指定processData的可能性:false以及使用自定义方式构建请求参数buildParams函数,而不是通过$ .param jQuery函数。

关于javascript - 将哈希表{}从JavaScript传递到mvc3 Controller ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8454597/

10-17 02:33