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

C# 将字典传递给控制器asp.net mvc,c#,javascript,asp.net-mvc,ajax,dictionary,C#,Javascript,Asp.net Mvc,Ajax,Dictionary,我想通过Ajax帖子将类型的字典传递给我的控制器。 这里的主要原因是post在这里可能有1-3个键值对(这些值在编译时都是未知的),将来可能会增加到5个 此外,在帖子中,我还必须传递一些其他数据,如Id和姓名,这些数据都正常工作 我如何在javascript中构造这个词汇表,然后通过JQuery post发送它,最后在控制器上接收它以进行处理 编辑2: 我决定只为每个值写一篇文章来解决这个问题,而不是试图传递字典 编辑: 以下是我的函数源代码,您可以看到我正在尝试的内容: function Bi

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

此外,在帖子中,我还必须传递一些其他数据,如Id和姓名,这些数据都正常工作

我如何在javascript中构造这个词汇表,然后通过JQuery post发送它,最后在控制器上接收它以进行处理

编辑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();
                }
            });
        });

    }
类似(javascript)的东西

然后,您可以使用
字典
作为属性类型将
dict
对象发布到控制器

ActionResult MyPostAction(Dictionary<string, int> myDictionary)
客户端(JavaScript):

注意:“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....
}

当需要
字典时,JavaScript对象/字典必须作为键值对列表传递给ASP.NET MVC控制器。例如:

如果您有这样一本词典:

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

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

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

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

$.post('/YourController/YourAction/', dict);
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] });
    }
}
var validDict=new Array();
validDict[0]={键:1,值:4}
validDict[1]={键:42,值:5}
var path=“@Url.Action(“ControllerName”、“ActionName”)”;
$.ajax({
url:path,
类型:“POST”,
数据:JSON.stringify(validdit),
contentType:“应用程序/json;字符集=utf-8”,
async:false,
成功:功能(状态,xhr)
{
警报(状态);
},
错误:函数(xhr、状态、错误)
{
警报(错误);
}});
然后在控制器中:

        [HttpPost]
        public ActionResult ActionName(Dictionary<int, int> validDict)
        {
        // doStuff();
        return Content("Success");
        }
[HttpPost]
public ActionResult ActionName(字典有效)
{
//doStuff();
返回内容(“成功”);
}

当像你建议的那样传递字典时,我会得到一个空对象。我已经更新了我的问题以显示我的来源。ThanksI现在已经尝试将字典命名为string,int和string,string。将帖子更改为如何列出,但仍然没有显示任何值。谢谢你迄今为止的帮助。我真的不知道如何才能让这个工作检查我的编辑。你是否用
”包围了字典项?@JanJongboom,它对我也不起作用,找不到方法。我都试过了。但只有你的解决方案有效。那么+1对你来说,你能写下get请求吗?我想在chrome的PostMan插件中测试它,所以我需要将我的参数传递给dict参数
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] });
    }
}
        [HttpPost]
        public ActionResult ActionName(Dictionary<int, int> validDict)
        {
        // doStuff();
        return Content("Success");
        }