2010-01-04 21 views
15

Quiero pasar un diccionario de tipo <int,int> a mi controlador a través de una publicación de Ajax. La razón principal aquí es que la publicación puede tener entre 1-3 pares de valores clave aquí (ninguno de estos valores se conoce en tiempo de compilación) y en el futuro puede llegar hasta 5.pase el diccionario al controlador asp.net mvc

También en la publicación Tengo para pasar otros datos, como Id y name, que funcionan todos normalmente.

¿Cómo construiría este dictionay en el javascript y luego lo enviaría a través de la publicación JQuery y finalmente lo recibiría en el controlador para su procesamiento?

Editar 2: He decidido resolver esto solo con una publicación para cada valor en lugar de intentar pasar un diccionario.

EDIT: Aquí es mi fuente de la función para que pueda ver lo que estoy tratando:

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

    } 

Respuesta

18

Algo así como (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 }); 

entonces se puede colocar el objeto dict a su controlador usando un Dictionary<int, int> como tipo de propiedad.

ActionResult MyPostAction(Dictionary<string, int> myDictionary) 

edición de la segunda vez que el código del autor:

las siguientes obras para mí, cuando tienen un Dictionary<string, int> kvPairs. <int, int> no va a funcionar después de todo.

Haga su post como:

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

Al pasar el diccionario como sugiere, obtengo un objeto nulo. He actualizado mi pregunta para mostrar mi fuente. Gracias – ddd

+0

Verifique mi edición. –

+0

Ahora probé el diccionario como cadena, int y cadena, cadena.Cambió la publicación a la forma en que la lista y todavía no muestra ningún valor. Gracias por la ayuda hasta ahora. Realmente no sé de qué otra manera conseguir que esto funcione – ddd

1

cliente (JavaScript):

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

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

NOTA: Los objetos "dict" recibe serializados detrás de las escenas antes de ser enviado a su acción.

Servidor:

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

¿Podría escribir la solicitud get? Me gustaría probarlo en el plugin de PostMan para Chrome, así que necesito pasar mis parámetros al dict param –

11

JavaScript objeto/diccionario tiene que ser pasado como una lista de pares de valores clave al controlador ASP.NET MVC cuando se espera Dictionary<TKey, TValue>. Ejemplo:

Si usted tiene un diccionario de esta manera:

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

entonces usted tiene que usar algo como esto en su 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] }); 
    } 
} 

He usado este enfoque en la solicitud POST asíncrono (enviado usando jQuery) que tenía el tipo de contenido establecido en 'application/json' (esto puede o no ser importante en su caso).

+0

Lo intenté todo. Pero solo tu solución funcionó. así que +1 para ti – Deb

Cuestiones relacionadas