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
.
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.... }