2009-12-03 8 views
13

Tiene que haber algo que me falta. He intentado usar $ .ajax() y $ .post() para enviar una cadena a mi controlador ASP.NET MVC, y mientras se llega al controlador, la cadena es nula cuando llega allí. Así que aquí es el método post he intentado:

$.post("/Journal/SaveEntry", JSONstring); 

Y aquí está el método ajax Traté:

$.ajax({ 
    url: "/Journal/SaveEntry", 
    type: "POST", 
    data: JSONstring 
}); 

Aquí está mi controlador:

public void SaveEntry(string data) 
{ 
    string somethingElse = data; 
} 

Para el fondo, yo serializado una Objeto JSON utilizando JSON.stringify(), y esto ha sido exitoso. Estoy tratando de enviarlo a mi controlador para deserializarlo(). Pero como dije, la cadena está llegando como nula cada vez. ¿Algunas ideas?

Muchas gracias.

ACTUALIZACIÓN: Me respondieron que mi problema era que no estaba usando un par de clave/valor como parámetro de $ .post(). Así que he intentado esto, pero la cadena aún llegué al controlador como nulo:

$.post("/Journal/SaveEntry", { "jsonData": JSONstring }); 
+0

en respuesta a su actualización ... ¿Se puede disparar? ¿Qué se está enviando realmente como solicitud al servidor en su consola Firebug? – prodigitalson

Respuesta

19

Respondido. No tenía los nombres de las variables configurados correctamente después de mi primera actualización.He cambiado el nombre de la variable en el controlador de jsonData, por lo que mi nueva cabecera controlador se parece a:

public void SaveEntry(string jsonData) 

y mi acción posterior en JS parece:

$.post("/Journal/SaveEntry", { jsonData: JSONstring }); 

jsonString es un "stringified" (o "serializado") objeto JSON que serialé usando el JSON plugin ofrecido en json.org. Por lo tanto:

JSONstring = JSON.stringify(journalEntry); // journalEntry is my JSON object 

así que los nombres de las variables en los $ .post, y en el método controlador necesita ser el mismo nombre, o no funcionará nada. Bueno saber. Gracias por las respuestas.

5

respuesta final:

Parece que los nombres de las variables no se alineaban en su puesto como sugerí en una comentarios después de la clasificación de los problemas de formato de datos (suponiendo que era también un problema.

en realidad, asegúrese usted está utilizando el nombre de la clave correcta que su código serverside está buscando, así como por Ejemplo de Olek - es decir. si su código es buscando los datos variables, entonces usted necesita usar los datos como su clave. - prodigitalson hace 6 horas

@prodigitalson, eso funcionó. Los nombres de las variables no estaban alineados. ¿ publicará una segunda respuesta para que pueda aceptarlo? Gracias. - Mega Mat 6 horas hace

por lo que necesitaba utilizar un par clave/valor, y asegurarse de que estaba agarrando la variable de la derecha desde la solicitud en el lado del servidor.


argumento de los datos tiene que ser el valor par de claves

$.post("/Journal/SaveEntry", {"JSONString": JSONstring}); 
+0

@prodigitalson, acepto que esta es una opción, pero la documentación en http: // docs.jquery.com/Ajax/jQuery.post dice que aceptará pares clave/valor (Mapa) o una Cadena. Así que me quedo un poco confundido ... –

+1

@Mega Matt: Si utiliza una cadena que supongo que tiene que ser en formato de cadena de consulta es decir estándar. JSONString = mySerializedDataStruct & var2 = myothervar. Para recuperarlo en el servidor, la variable debe tener un nombre. – prodigitalson

+0

@prodigitalson, intenté utilizar el método que contestó anteriormente sin éxito. Ver mi edición arriba. –

1

Parece tipo de datos se pierde. También puede configurar contentType por si acaso. ¿Intentarías esta versión?

$.ajax({ 
    url: '/Journal/SaveEntry', 
    type: 'POST', 
    data: JSONstring, 
    dataType: 'json', 
    contentType: 'application/json; charset=utf-8' 
}); 

Cheers.

+0

@Oleksandr Bernatskyi, pero debe ser el tipo de datos 'json' cuando estoy enviando una cadena de nuevo? Este no es un objeto JSON, simplemente una cadena ... –

+1

Oh, ya veo. @prodigitalson dijo que lo correcto en realidad, cada variable debería tener un nombre. Quizás esto funcionará? $ .post ("/ Journal/SaveEntry", {"datos": JSONstring}); –

+1

En realidad, asegúrese de que está utilizando el nombre de la clave correcta que está buscando su código del servidor, así como por el ejemplo de Olek, es decir. Si su código está buscando datos variables, entonces necesita usar los datos como su clave. – prodigitalson

1

Gracias por la respuesta, esto resuelve mi pesadilla.

Mi rejilla

.. 
.Selectable() 
.ClientEvents(events => events.OnRowSelected("onRowSelected")) 
.Render(); 

<script type="text/javascript"> 
function onRowSelected(e) { 
     id = e.row.cells[0].innerHTML; 
     $.post("/<b>MyController</b>/GridSelectionCommand", { "id": id}); 
    } 
</script> 

mi regulador

public ActionResult GridSelectionCommand(string id) 
{ 
    //Here i do what ever i need to do 
} 
0

el camino es aquí.

Si desea especificar

tipoDatos: 'json'

A continuación, utilice,

$('#ddlIssueType').change(function() { 


      var dataResponse = { itemTypeId: $('#ddlItemType').val(), transactionType: this.value }; 

      $.ajax({ 
       type: 'POST', 
       url: '@Url.Action("StoreLocationList", "../InventoryDailyTransaction")', 
       data: { 'itemTypeId': $('#ddlItemType').val(), 'transactionType': this.value }, 
       dataType: 'json', 
       cache: false, 
       success: function (data) { 
        $('#ddlStoreLocation').get(0).options.length = 0; 
        $('#ddlStoreLocation').get(0).options[0] = new Option('--Select--', ''); 

        $.map(data, function (item) { 
         $('#ddlStoreLocation').get(0).options[$('#ddlStoreLocation').get(0).options.length] = new Option(item.Display, item.Value); 
        }); 
       }, 
       error: function() { 
        alert("Connection Failed. Please Try Again"); 
       } 
      }); 

Si no se especifica

tipoDatos: 'JSON '

A continuación, utilice

$('#ddlItemType').change(function() { 

     $.ajax({ 
      type: 'POST', 
      url: '@Url.Action("IssueTypeList", "SalesDept")', 
      data: { itemTypeId: this.value }, 
      cache: false, 
      success: function (data) { 
       $('#ddlIssueType').get(0).options.length = 0; 
       $('#ddlIssueType').get(0).options[0] = new Option('--Select--', ''); 

       $.map(data, function (item) { 
        $('#ddlIssueType').get(0).options[$('#ddlIssueType').get(0).options.length] = new Option(item.Display, item.Value); 
       }); 
      }, 
      error: function() { 
       alert("Connection Failed. Please Try Again"); 
      } 
     }); 

Si desea especificar

tipoDatos: 'json' y contentType: 'application/json; charset = UTF-8'

a continuación, utilizar

$.ajax({ 
      type: 'POST', 
      url: '@Url.Action("LoadAvailableSerialForItem", "../InventoryDailyTransaction")', 
      data: "{'itemCode':'" + itemCode + "','storeLocation':'" + storeLocation + "'}", 
      contentType: "application/json; charset=utf-8", 
      dataType: 'json', 
      cache: false, 
      success: function (data) { 

       $('#ddlAvailAbleItemSerials').get(0).options.length = 0; 
       $('#ddlAvailAbleItemSerials').get(0).options[0] = new Option('--Select--', ''); 

       $.map(data, function (item) { 
        $('#ddlAvailAbleItemSerials').get(0).options[$('#ddlAvailAbleItemSerials').get(0).options.length] = new Option(item.Display, item.Value); 
       }); 
      }, 
      error: function() { 
       alert("Connection Failed. Please Try Again."); 
      } 
     }); 
0

Si usted todavía no puede conseguir que funcione, intente comprobar la URL de la página que está llamando la $.post de.

En mi caso se llama a este método de localhost:61965/Example y mi código era:

$.post('Api/Example/New', { jsonData: jsonData }); 

Firefox envía esta solicitud a localhost:61965/Example/Api/Example/New, por lo que mi solicitud no funcionaba.

Cuestiones relacionadas