2010-01-04 18 views
15

Ich möchte ein Wörterbuch des Typs <int,int> an meinen Controller über eine Ajax-Post übergeben. Der Hauptgrund hier ist, dass die Post hier zwischen 1-3 Schlüsselwertpaaren haben kann (keiner dieser Werte ist zur Kompilierzeit bekannt) und in Zukunft kann es bis zu 5 gehen.pass Wörterbuch an Controller asp.net mvc

Auch in der Post habe ich um einige andere Daten, wie ID und Name, zu übergeben, die alle wie normal funktionieren.

Wie würde ich diesen Dictionay in der Javascript erstellen, dann senden Sie es über den JQuery Beitrag und schließlich erhalten es auf dem Controller zu verarbeiten?

Edit 2: Ich habe beschlossen, dies nur mit einem Beitrag für jeden Wert zu lösen, anstatt zu versuchen, ein Wörterbuch zu übergeben.

EDIT: Hier ist meine Quelle für die Funktion, so können Sie sehen, was ich versuche:

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

    } 

Antwort

18

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

Sie können dann poste dict Objekt Ihr Controller verwendet einen Dictionary<int, int> als Eigenschaftstyp.

ActionResult MyPostAction(Dictionary<string, int> myDictionary) 

bearbeiten von Autoren Code zweites Mal: ​​

Die folgenden Werke für mich, wenn ein Dictionary<string, int> kvPairs haben. <int, int> wird schließlich nicht funktionieren.

Machen Sie Ihren Beitrag wie:

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

Wenn Sie das Wörterbuch wie vorgeschlagen weitergeben, erhalte ich ein Null-Objekt. Ich habe meine Frage aktualisiert, um meine Quelle anzuzeigen. Danke – ddd

+0

Überprüfen Sie meine Bearbeitung. –

+0

Ich habe jetzt das Wörterbuch als String, Int und String, String versucht.Der Beitrag wurde so geändert, wie Sie ihn aufgelistet haben, und er zeigt immer noch keine Werte an. Danke für die Hilfe bis jetzt. Ich weiß nicht wirklich, wie ich das sonst so funktioniere – ddd

1

Client (JavaScript):

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

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

HINWEIS: Die "dict" Objekte hinter den Kulissen serialisiert werden, bevor die Aktion gesendet werden.

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

Können Sie die Anfrage schreiben? Ich möchte es im PostMan Plugin für Chrome testen, also muss ich meine Parameter an das dict param übergeben –

11

JavaScript-Objekt/Wörterbuch hat als eine Liste von Schlüssel-Wert-Paare in ASP.NET MVC-Controller übergeben werden, wenn Dictionary<TKey, TValue> erwartet wird. Beispiel:

Wenn Sie ein Wörterbuch wie folgt aus:

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

dann haben Sie etwas in Ihrem JavaScript verwenden:

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

ich diesen Ansatz in asynchronen POST-Anforderung verwendet haben (gesendet mit jQuery), bei dem der Inhaltstyp auf 'application/json' gesetzt wurde (dies kann in Ihrem Fall wichtig sein oder nicht).

+0

Ich habe alles versucht. Aber nur deine Lösung hat funktioniert. also +1 an dich – Deb