【问题标题】:pass dictionary to controller asp.net mvc将字典传递给控制器​​ 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();
                }
            });
        });

    }

【问题讨论】:

    标签: c# javascript asp.net-mvc ajax dictionary


    【解决方案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 中

      【讨论】:

        猜你喜欢
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多