发布
社区首页 >问答首页 >将哈希表{}从javascript传递到mvc3控制器?

将哈希表{}从javascript传递到mvc3控制器?
EN

Stack Overflow用户
提问于 2011-12-10 13:18:46
回答 2查看 2.5K关注 0票数 1

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

代码语言:javascript
代码运行次数:0
复制
var hashtable = {};
hashtable['screaming'] = ["1", "2"];
hashtable['mellow'] = ["3", "4", "5"];
$.get('@Url.Action("PerformMagic")', { 'theValues': hashtable }, function (data) {
    //Callback..    
});

我的控制器方法sig看起来像什么?

代码语言:javascript
代码运行次数:0
复制
public ActionResult PerformMagic(/*What type goes here? string[] theValues or string[][] theValues)
{
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-12 15:26:45

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

代码语言:javascript
代码运行次数:0
复制
public ActionResult PerformMagic(Dictionary<String, List<int>> theValues)
{
    // the magic!
}

当使用MVC功能将值传递给ASP.NET MVC时,您将面临一个很大的框架误解。ASP.NET MVC ModelBinder需要使用此命名方案绑定到请求正文中的字典或URL值

代码语言:javascript
代码运行次数:0
复制
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中的值

代码语言:javascript
代码运行次数:0
复制
theValues[key0][]=value0.0
theValues[key0][]=value0.1
theValues[key1][]=value1.0
theValues[key1][]=value1.1
theValues[key1][]=value1.2

在这两个示例中,我省略了'&‘,并将请求值拆分到单独的行中,以获得更好的可读性。

因此,如果您希望将值作为字典传递给操作方法,则需要让jQuery和ASP.NET MVC Model Binders说话。我能想到两个选择:

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

方法1将要求您编写自己的模型绑定器,并且由于绑定到字典操作参数的命名功能隐藏在内部UpdateDictionary方法中的某个地方,因此编写您自己的模型绑定器将意味着复制大量的ASP.NET MVC DefaultModelBinder代码...

方法2应该非常容易实现,因为jQuery使用param函数来构建请求参数,而jQuery ajax函数允许您只传入由自定义函数转换的原始值来请求参数。有关jQuery ajax函数的更多详细信息,请访问found here。参见“processData”一节。

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

代码语言:javascript
代码运行次数:0
复制
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函数构建的。

票数 3
EN

Stack Overflow用户

发布于 2011-12-10 14:32:28

你希望你的控制器是什么样子的?你可以像这样分解它:

代码语言:javascript
代码运行次数:0
复制
public ActionResult PerformMagic(string[] screaming, string[] mellow) { }

$.get('@Url.Action("PerformMagic")', { screaming: hashtable.screaming, mellow: hashtable.mellow }

或者,如果您希望传递一个string[][],这可能会起作用

代码语言:javascript
代码运行次数:0
复制
var hashtable = [];
hashtable.push(["1", "2"]);
hashtable.push(["3", "4", "5"]);

$.get('@Url.Action("PerformMagic")', { arrayOfArrays: hashtable }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8454597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档