2010-01-04 9 views
15

Je souhaite passer un dictionnaire de type <int,int> à mon contrôleur via un poste Ajax. La raison principale ici est le poste peut avoir entre 1-3 paires de valeurs clés ici (aucune de ces valeurs sont connues à la compilation) et dans le futur, il peut aller jusqu'à 5.dictionnaire de passe au contrôleur asp.net mvc

Aussi dans le poste que j'ai transmettre d'autres données, telles que Id et name, qui fonctionnent normalement.

Comment est-ce que je construirais ce dictionay dans le javascript puis l'enverrais par l'intermédiaire du message de JQuery et le recevrais finalement sur le contrôleur pour traiter?

Éditer 2: J'ai décidé de résoudre cela avec un message pour chaque valeur au lieu d'essayer de passer un dictionnaire.

EDIT: Voici ma source pour la fonction afin que vous puissiez voir ce que je suis en train:

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

    } 

Répondre

18

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 poster l'objet dict à votre contrôleur utilisant un Dictionary<int, int> comme type de propriété.

ActionResult MyPostAction(Dictionary<string, int> myDictionary) 

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

Les œuvres suivantes pour moi, quand ayant une Dictionary<string, int> kvPairs. <int, int> ne va pas au travail après tout.

Faites votre poste 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); }); 
+0

Lorsque vous passez le dictionnaire comme vous le suggérez, j'obtiens un objet nul. J'ai mis à jour ma question pour montrer ma source. Merci – ddd

+0

Vérifiez ma modification. –

+0

J'ai maintenant essayé le dictionnaire en tant que chaîne, int et chaîne, chaîne.Modification de la publication sur la façon dont vous l'affichez et elle n'affiche aucune valeur. Merci du coup de main jusqu'à présent. Je ne sais pas vraiment comment faire fonctionner ceci – ddd

1

client (JavaScript):

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

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

REMARQUE: Les objets "dict" obtient sérialisés dans les coulisses avant d'être envoyé à votre action.

Serveur:

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

Pourriez-vous écrire la demande d'obtention? Je voudrais tester dans le plugin PostMan pour le chrome, donc j'ai besoin de passer mes paramètres à la dict –

11

objet JavaScript/dictionnaire doit être passé comme une liste de paires clé-valeur de contrôleur ASP.NET MVC quand Dictionary<TKey, TValue> est attendue. Exemple:

Si vous avez un dictionnaire comme celui-ci:

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

alors vous devez utiliser quelque chose comme ça 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] }); 
    } 
} 

Je l'ai utilisé cette approche dans la requête POST asynchrone (envoyé à l'aide de jQuery) dont le type de contenu est défini sur 'application/json' (cela peut être important ou non dans votre cas).

+0

J'ai essayé tous. Mais seulement votre solution a fonctionné. donc +1 à toi – Deb

Questions connexes