2010-01-04 46 views
15

Tôi muốn chuyển một từ điển loại <int,int> đến bộ điều khiển của tôi qua bài đăng Ajax. Lý do chính ở đây là bài đăng có thể có từ 1-3 cặp giá trị chính ở đây (không có giá trị nào trong số này được biết tại thời gian biên dịch) và trong tương lai có thể lên tới 5.chuyển từ điển sang bộ điều khiển asp.net mvc

Ngoài bài đăng tôi có để chuyển vào một số dữ liệu khác, chẳng hạn như Id và tên, tất cả đều hoạt động như bình thường.

Tôi làm cách nào để xây dựng từ điển này trong javascript sau đó gửi nó qua bài đăng JQuery và cuối cùng nhận được nó trên bộ điều khiển để xử lý?

Chỉnh sửa 2: Tôi đã quyết định chỉ giải quyết vấn đề này với một bài đăng cho mỗi giá trị thay vì cố gắng chuyển một từ điển.

EDIT: Đây là nguồn của tôi cho các chức năng để bạn có thể thấy những gì tôi đang cố gắng:

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

    } 

Trả lời

18

Giống như (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 }); 

Sau đó bạn có thể gửi các đối tượng dict để bộ điều khiển của bạn sử dụng loại Dictionary<int, int> làm loại thuộc tính.

ActionResult MyPostAction(Dictionary<string, int> myDictionary) 

chỉnh sửa từ mã lần thứ hai của tác giả:

Các công trình sau đây đối với tôi, khi có một Dictionary<string, int> kvPairs. <int, int> sẽ không hoạt động sau khi tất cả.

Hãy bài của bạn như:

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

Khi chuyển từ điển như bạn đề nghị tôi nhận được một đối tượng null. Tôi đã cập nhật câu hỏi của mình để hiển thị nguồn của tôi. Cảm ơn – ddd

+0

Kiểm tra chỉnh sửa của tôi. –

+0

Tôi hiện đã thử từ điển dưới dạng chuỗi, int và chuỗi, chuỗi.Đã thay đổi bài đăng về cách bạn liệt kê bài đăng và nó vẫn không hiển thị bất kỳ giá trị nào. Cảm ơn sự giúp đỡ cho đến nay. Tôi thực sự không biết làm cách nào khác để làm việc này – ddd

1

Khách hàng (JavaScript):

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

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

LƯU Ý: Các "dict" các đối tượng được đăng đằng sau hậu trường trước khi được gửi đến hành động của bạn.

Server:

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

Bạn có thể viết yêu cầu nhận được không? Tôi muốn thử nghiệm nó trong PostMan plugin cho chrome, vì vậy tôi cần phải vượt qua các tham số của tôi để tham số dict –

11

JavaScript đối tượng/từ điển phải được thông qua như là một danh sách các cặp khóa-giá trị điều khiển ASP.NET MVC khi Dictionary<TKey, TValue> được mong đợi. Ví dụ:

Nếu bạn có một cuốn từ điển như thế này:

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

sau đó bạn phải sử dụng một cái gì đó như thế này trong 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] }); 
    } 
} 

Tôi đã sử dụng phương pháp này trong yêu cầu POST không đồng bộ (được gửi bằng jQuery) có loại nội dung được đặt thành 'application/json' (điều này có thể hoặc có thể không quan trọng trong trường hợp của bạn).

+0

Tôi đã thử tất cả. Nhưng chỉ có giải pháp của bạn làm việc. vậy +1 với bạn – Deb

Các vấn đề liên quan