将字典传递给控制器​​ asp.net mvc

Posted

技术标签:

【中文标题】将字典传递给控制器​​ asp.net mvc【英文标题】:pass dictionary to controller asp.net mvc 【发布时间】:2011-01-01 06:06:25 【问题描述】:

我想通过 Ajax 帖子将 <int,int> 类型的字典传递给我的控制器。 这里的主要原因是帖子在这里可能有 1-3 个键值对(这些值在编译时都不知道),将来可能会增加到 5 个。

在帖子中我还必须传入一些其他数据,例如 ID 和名称,这些都正常工作。

我将如何在 javascript 中构建这个字典,然后通过 JQuery 帖子发送它,最后在控制器上接收它进行处理?

编辑 2: 我决定只用每个值的帖子来解决这个问题,而不是尝试传递字典。

编辑: 这是我的函数来源,因此您可以看到我正在尝试的内容:

function BindAddMenuItem() 
        $(".AddMenuItem").click(function (e) 
            e.preventDefault();

            //get header id from link by removing addmenuitem from this.id
            var currentId = $(this).attr("id").replace("AddMenuItem", "");

            //get itemnumber, itemname, itemdetails from textboxes with same header id
            var restaurantId = jQuery.trim($("#RestaurantId").val());
            var itemNumber = jQuery.trim($("#ItemNumber" + currentId).val());
            var itemName = jQuery.trim($("#ItemName" + currentId).val());
            var itemDetails = jQuery.trim($("#ItemDetails" + currentId).val());

            var costs = new Object();
            //select all textboxes with class "Header" + currentId
            $(".Header" + currentId).each(function (i) 
                var optionId = $(this).attr("id").replace("Option", "");
                costs[optionId] = $(this).val();
            );


            $.ajax(
            
                type: "POST",
                url: "/Menu/AddMenuItem",
                data: "reastaurantId=" + restaurantId + "&menuHeaderId=" + currentId + "&itemNumber=" + itemNumber + "&itemName=" + itemName + "&itemDetails=" + itemDetails + "&costs=" + costs,
                dataType: "html",
                success: function (result) 
                    var domElement = $(result);
                    $("#MenuContainer").replaceWith(domElement);
                    var newNum = parseInt(itemNumber) + 1;
                    $("#ItemNumber" + currentId).val(newNum);
                    BindAllBehaviours();
                
            );
        );

    

【问题讨论】:

【参考方案1】:

类似(javascript)的东西

dict = new Object();
dict['12'] = 5;
dict['13'] = 6;
dict['1000'] = 21;
dict['9'] = 13;
dict['13'] = 48;

$.post('/client.mvc/mypostaction/',  myDictionary: dict );

然后您可以使用Dictionary<int, int> 作为属性类型将dict 对象发布到您的控制器。

ActionResult MyPostAction(Dictionary<string, int> myDictionary)

第二次从作者的代码中编辑:

当有Dictionary&lt;string, int&gt; kvPairs 时,以下内容对我有用。 &lt;int, int&gt; 毕竟是行不通的。

让你的帖子像:

var dict = new Object();
dict['13'] = 9;
dict['14'] = 10;
dict['2'] = 5;

$.post('controller.mvc/Test',  'kvPairs': dict , function(obj)  $('#output').html(obj.Count); ); 

【讨论】:

当像你这样传递字典时,我建议我得到一个空对象。我已经更新了我的问题以显示我的来源。谢谢 我现在已经尝试将字典作为字符串,整数和字符串,字符串。将帖子更改为您列出的方式,但它仍然没有显示任何值。感谢你目前的帮助。我真的不知道还有什么方法可以让这个工作 检查我的编辑。你用'包围了字典项吗? @JanJongboom ,它对我也不起作用,它没有找到方法。【参考方案2】:

当需要Dictionary&lt;TKey, TValue&gt; 时,JavaScript 对象/字典必须作为键值对列表传递给 ASP.NET MVC 控制器。示例:

如果你有这样的字典:

public Dictionary<string, decimal?> SomeMapping  get; set; 

那么你必须在你的 JavaScript 中使用这样的东西:

var sourceMapping =  a: 1, b: 1.5, c: null ;
var SomeMapping = [];
for (var key in sourceMapping) 
    if (sourceMapping.hasOwnProperty(key)) 
        SomeMapping.push( Key: key, Value: sourceMapping[key] );
    

我在内容类型设置为 'application/json' 的异步 POST 请求(使用 jQuery 发送)中使用了这种方法(这在您的情况下可能很重要,也可能不重要)。

【讨论】:

我都试过了。但只有你的解决方案有效。所以 +1 给你【参考方案3】:

客户端(JavaScript):

var dict = new Object();
dict.Key1 = "Value1"
dict.Key2 = "Value2"

$.post('/YourController/YourAction/', dict);

注意:“dict”对象在发送到您的操作之前会在幕后序列化。

服务器:

public ActionResult YourAction()

    string postData = string.Empty;
    using (StreamReader sr = new StreamReader(Request.InputStream))
    
        postData = sr.ReadToEnd();
        

    //Load post data into JObject (Newtonsoft.Json)
    JObject o = JObject.Parse(postData);

    //Extract each key/val 
    string val1 = (string)o["Key1"];

    //Do whatever....

【讨论】:

你能写get请求吗?我想在 chrome 的 PostMan 插件中测试它,所以我需要将我的参数传递给 dict 参数【参考方案4】:

除了mczers 之外,这些对我都不起作用,但他没有显示所有步骤,并且当您试图记住如何设置 ajax 请求时会变得很困难。所以我想把所有真正有效的东西都放进去。首先,在 JavaScript 中:

        var validDict = new Array();
        validDict[0] =  key: 1, value: 4 
        validDict[1] =  key: 42, value: 5


var path = "@Url.Action("ControllerName", "ActionName")";
        $.ajax(
            url: path,
            type: "POST",
            data: JSON.stringify(validDict),
            contentType: "application/json; charset=utf-8",
            async:false,
            success: function(status, xhr)
            

                alert(status);
              
            ,
            error: function(xhr, status, error)
            
                alert(error);
               

            );

然后在你的控制器中:

        [HttpPost]
        public ActionResult ActionName(Dictionary<int, int> validDict)
        
        // doStuff();
        return Content("Success");
        

【讨论】:

【参考方案5】:

IDictionary 类型的字典可以在服务器端从 javascript 中发布

"Key1": "Value1", "Key2": "Value2"

在 ASP.NET Web API 中的服务器端

[HttpPost]
public IHttpActionResult([FromBody]IDictionary<string, string> requestParam)

上面的例子是一个 Http POST,其中 Json 数据在 Body 中

【讨论】:

以上是关于将字典传递给控制器​​ asp.net mvc的主要内容,如果未能解决你的问题,请参考以下文章

模型在使用 C# 将 POST 方法作为参数传递给 ASP.NET MVC 中同一控制器的 GET 方法时获取 NULL

ASP .NET MVC Redirecttoaction 将参数传递给 Index 但值为空

如何将多个参数传递给 ASP.NET Core 中的 get 方法

使用 jQuery 验证插件将多个值发送到 ASP.NET MVC 控制器操作?

如何继承 ASP.NET MVC 控制器并仅更改视图?

如何将参数传递给 ASP.NET MVC 中的局部视图?