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

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

同样在post中我必须传递一些其他数据,例如Id和name,这些数据都正常。

我将如何在javascript中构建这个词典,然后通过JQuerypost发送它,最后在控制器上接收它来处理?

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

编辑:这是我的function来源,所以你可以看到我在尝试:

 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 = new Object(); dict['12'] = 5; dict['13'] = 6; dict['1000'] = 21; dict['9'] = 13; dict['13'] = 48; $.post('/client.mvc/mypostaction/', { myDictionary: dict }); 

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

 ActionResult MyPostAction(Dictionary myDictionary) 

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

当我有一个Dictionary kvPairs时,以下内容对我Dictionary kvPairs毕竟不会起作用。

让你的post像:

 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); }); 

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

如果您有这样的字典:

 public Dictionary 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] }); } } 

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

客户端(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.... }