2010-01-04 4 views
15

Я хочу передать словарь типа <int,int> моему контроллеру через пост Ajax. Основная причина здесь в том, что сообщение может иметь между 1-3 ключевыми парами значений здесь (ни одно из этих значений не известно во время компиляции), и в будущем он может подняться до 5.pass dictionary to controller asp.net mvc

Также в сообщении у меня есть передать некоторые другие данные, такие как Id и имя, которые работают нормально.

Как я могу построить этот dictionay в javascript, затем отправить его через сообщение JQuery и, наконец, получить его на контроллере для обработки?

Редактировать 2: Я решил просто решить это с помощью сообщения для каждого значения вместо того, чтобы пытаться передать словарь.

EDIT: Вот мой источник для функции, так что вы можете увидеть, что я пытаюсь:

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

+0

Проверьте мои изменения. –

+0

Теперь я попробовал словарь как строку, int и string, string.Изменено сообщение о том, как вы его перечислите, и оно по-прежнему не показывает никаких значений. Спасибо за помощь до сих пор. Я действительно не знаю, как еще получить эту работу. – ddd

1

Client (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.... 
} 
+0

Не могли бы вы написать запрос на получение? Я бы хотел протестировать его в плагине PostMan для chrome, поэтому мне нужно передать свои параметры в параметр dict. –

11

JavaScript объект/словарь должен быть передан в виде списка пар ключ-значение в контроллере ASP.NET MVC, когда Dictionary<TKey, TValue> ожидается. Пример:

Если у вас есть словарь, как это:

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

Смежные вопросы