2010-01-04 135 views
15

我想通过一个Ajax文章传递给我的控制器类型<int,int>字典。 这里的主要原因是后可以在这里1-3之间的键值对(没有这些值在编译时就知道),并在未来可能上升到5传递字典到控制器asp.net mvc

另外,在文章中,我有以传递一些其他数据,如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(); 
       } 
      }); 
     }); 

    } 

回答

18

喜欢的东西(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 }); 

然后,您可以发布dict对象你的控制器使用Dictionary<int, int>作为属性类型。从笔者的代码,第二次

ActionResult MyPostAction(Dictionary<string, int> myDictionary) 

编辑:

以下工作对我来说,有Dictionary<string, int> kvPairs时。毕竟,<int, int>不会起作用。

让您的文章,如:

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

当传递字典像你建议我得到一个空对象。我已更新我的问题以显示我的来源。谢谢 – ddd 2010-01-04 17:19:43

+0

检查我的编辑。 – 2010-01-04 18:55:46

+0

我现在已经尝试字典作为字符串,整数和字符串,字符串。将帖子更改为如何列出,但仍不显示任何值。感谢你目前的帮助。我真的不知道如何才能正常工作 – ddd 2010-01-04 18:55:53

1

客户端(JavaScript的):

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

$.post('/YourController/YourAction/', 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.... 
} 
+0

你能写出获取请求吗?我想在PostMan插件中测试它的铬版,所以我需要将我的参数传递给字典参数 – 2017-06-15 13:54:44

11

JavaScript对象/词典有当Dictionary<TKey, TValue>有望被作为键值对到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] }); 
    } 
} 

我用异步POST请求这种方法(使用jQuery发送)的内容类型设置为'application/json'(这可能或可能不重要)。

+0

我试过了。但只有你的解决方案奏效。所以+1给你 – Deb 2015-07-12 07:26:31

相关问题