2010-01-04 35 views
15

Sto volendo passare un dizionario di tipo <int,int> al mio controller tramite un post Ajax. Il motivo principale qui è che il post può avere tra 1-3 coppie di valori chiave qui (nessuno di questi valori è noto al momento della compilazione) e in futuro potrebbe arrivare a 5.pass dizionario per controller asp.net mvc

Anche nel post ho per passare altri dati, come Id e nome, che funzionano tutti normalmente.

Come dovrei costruire questo dizione in javascript, quindi inviarlo tramite il post di JQuery e infine riceverlo sul controller da elaborare?

Modifica 2: Ho deciso di risolvere questo con un post per ogni valore invece di cercare di passare un dizionario.

EDIT: Qui è la mia fonte per la funzione in modo da poter vedere quello che sto cercando:

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

    } 

risposta

18

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

È possibile quindi inviare l'oggetto dict a il controller utilizzando un tipo di proprietà Dictionary<int, int>.

ActionResult MyPostAction(Dictionary<string, int> myDictionary) 

modificare dal codice seconda volta dell'autore:

le seguenti opere per me, quando avere un Dictionary<string, int> kvPairs. Dopo tutto, <int, int> non funzionerà.

Fai il tuo post come:

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

Quando si passa il dizionario come suggerisco, ottengo un oggetto nullo. Ho aggiornato la mia domanda per mostrare la mia fonte. Grazie – ddd

+0

Controlla la mia modifica. –

+0

Ora ho provato il dizionario come stringa, int e stringa, stringa.Modificato il post su come lo si elenca e non mostra ancora alcun valore. Grazie per l'aiuto finora. Non so davvero in quale altro modo per farlo funzionare. – ddd

1

client (JavaScript):

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

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

NOTA: Gli oggetti "dict" ottiene serializzate dietro le quinte prima di essere inviati alla vostra azione.

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

Potresti scrivere la richiesta get? Mi piacerebbe testarlo nel plugin PostMan per Chrome, quindi ho bisogno di passare i miei parametri al parametro dict –

11

JavaScript oggetto/dizionario deve essere passato come una lista di coppie chiave-valore a controllo ASP.NET MVC quando si prevede che Dictionary<TKey, TValue>. Esempio:

Se si dispone di un dizionario come questo:

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

allora devi usare qualcosa di simile nel tuo 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] }); 
    } 
} 

Ho usato questo approccio nella richiesta POST asincrona (inviato usando jQuery) con tipo di contenuto impostato su 'application/json' (questo potrebbe non essere importante nel tuo caso).

+0

Ho provato tutti. Ma solo la tua soluzione ha funzionato. così +1 a te – Deb

Problemi correlati