passer le dictionnaire au contrôleur asp.net mvc

Je souhaite transmettre un dictionnaire de type à mon contrôleur via un message Ajax. La raison principale ici est que la publication peut avoir entre 1 et 3 paires de valeurs clés (aucune de ces valeurs n’est connue au moment de la compilation) et peut aller jusqu’à 5 dans l’avenir.

De plus, je dois également transmettre d’autres données, telles que l’identifiant et le nom, qui fonctionnent normalement.

Comment pourrais-je construire ce dictionnaire en javascript, puis l’envoyer via le message JQuery et le recevoir enfin sur le contrôleur à traiter?

Edit 2: J’ai décidé de résoudre ceci avec un post pour chaque valeur au lieu d’essayer de passer un dictionnaire.

EDIT: Voici mon source pour la fonction afin que vous puissiez voir ce que j’essaye:

 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.sortingm($("#RestaurantId").val()); var itemNumber = jQuery.sortingm($("#ItemNumber" + currentId).val()); var itemName = jQuery.sortingm($("#ItemName" + currentId).val()); var itemDetails = jQuery.sortingm($("#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(); } }); }); } 

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

Vous pouvez ensuite publier l’object dict sur votre contrôleur en utilisant un type de propriété Dictionary .

 ActionResult MyPostAction(Dictionary myDictionary) 

modifier à partir du code de l’auteur une deuxième fois:

Ce qui suit fonctionne pour moi lorsque je possède un Dictionary kvPairs . ne fonctionnera pas après tout.

Faites votre post comme:

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

L’object / dictionnaire JavaScript doit être transmis sous forme de liste de paires clé-valeur au contrôleur ASP.NET MVC lorsque Dictionary est attendu. Exemple:

Si vous avez un dictionnaire comme celui-ci:

 public Dictionary SomeMapping { get; set; } 

alors vous devez utiliser quelque chose comme ceci dans votre 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] }); } } 

J’ai utilisé cette approche dans les requêtes POST asynchrones (envoyées à l’aide de jQuery) dont le type de contenu était défini sur 'application/json' (cela peut être important ou non dans votre cas).

Client (JavaScript):

 var dict = new Object(); dict.Key1 = "Value1" dict.Key2 = "Value2" $.post('/YourController/YourAction/', dict); 

NOTE: Les objects “dict” sont sérialisés en arrière-plan avant d’être envoyés à votre action.

Serveur:

 public ActionResult YourAction() { ssortingng postData = ssortingng.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 ssortingng val1 = (ssortingng)o["Key1"]; //Do whatever.... }