2009-06-16 17 views
6

Si está serializando un formulario usando algo como jQuery, a menudo asignará las claves JSON y los valores a las propiedades de un objeto en la acción del controlador en la que está publicando. Por lo tanto:Envío de varios elementos al controlador MVC a través de jQuery.Ajax

jQuery:

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize(), 
     complete: callFunction 
     } 
    }); 

Suponiendo principales datos contiene elementos que tendrá el nombre del parámetro como una clave que se deben asignar al objeto directamente:

Acción:

public void TestMVC(MyObject obj) 
{ 
//Obj should now contain the data from the serialised form 
} 

POST:

Name: "Bob" 
Age: "999" 
Sex: "Unknown" 

¿Alguien sabe cómo funciona esto? Se está rompiendo cada vez que paso el formulario y cualquier dato adicional al controlador.

Me gustaría enviar el contenido de los datos, así como una QueryString que podría contener cualquier número y tipo de pares clave/valor para el controlador. Puedo extraer estos pares clave/valor en el servidor ya que no puedo crear un objeto para ellos en la firma del método. Sin embargo, esto no funciona como se esperaba.

jQuery:

function PostForm() { 

    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: 
     { 
      Obj: $('#form').serialize(), 
      TheWeirdQueryString: $('.additionalParams').serialize(), 
     } 
    }); 
}; 

Acción:

public void TestMVC(MyObject obj, String TheWeirdQueryString) 
{ 
//Obj now does NOT contain the element, it is NULL. Whereas TheWeirdQueryString works fine. 
} 

la publicación:

Obj: name=bob&age=999&sex="unknown" 
TheWeirdQueryString: param1=1&param2=2 

creo que esto se debe a que en realidad he creado un objeto JSON como el de datos y establecer las propiedades al nombre del objeto.

Existe una diferencia en los valores POST que aparecen en Firebug. Cuando publico el objeto solo, los valores POST son todas las claves del objeto/formulario con sus valores correspondientes. En el segundo ejemplo, hay dos propiedades simples, El nombre que les di, cada una conteniendo una QueryString (Foo=1&Bar=2) y MVC no puede asignar una QueryString a los miembros de un objeto (o eso parecería).

¿Hay alguna manera de ponerse a trabajar como lo hace en la primera instancia, pero también para enviar datos adicionales a un segundo argumento en la Acción? Supongo que es para agregar una propiedad adicional a todas las existentes creadas cuando jquery realiza la serialización del formulario.

El POST realmente quiero es:

Name: "Bob" 
Age: "999" 
Sex: "Unknown" 
TheWeirdQueryString: param1=1&param2=2 
+0

Se puede publicar los valores posteriores que estamos viendo para ambos escenarios? No entiendo muy bien tu descripción. –

+0

Hecho. El último ejemplo es el mensaje que estoy tratando de hacer. – Damien

Respuesta

5

parámetro de tipo de datos en el método $ .ajax es el tipo de respuesta (el tipo de datos que usted está contando hacia atrás desde el servidor), no solicite.Tal vez puedas probar:

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize() + "&" + $('.additionalParams').serialize() 
    }); 
}; 

o:

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC" + "?" + $('.additionalParams').serialize(), 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize() 
    }); 
}; 

Actualizado:

Prueba esto:

controlador:

public void TestMVC(MyObject obj, String[] TheWeirdQueryString) 
{ 
} 

Cliente:

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize() + "&" + $('.additionalParams').serialize() 
    }); 
}; 

pero en el cliente lado sus parametros adicionales deben estar en el siguiente formato:

TheWeirdQueryString[0]=param1&TheWeirdQueryString[1]=param2&...&TheWeirdQueryString[n]=paramN 

así que $ ('. AdditionalParams') los elementos deben tener "id" y/o "nombre" atributos como: TheWeirdQueryString [1], TheWeirdQueryString [2] ... TheWeirdQueryString [N]

esperanza esto ayuda

+0

El resultado de jquery recibe un objeto JSON. Mis referencias se debieron a que creí que {} para datos creaba un objeto JSON. El primer ejemplo no funciona. Agrega los parámetros al primer objeto donde necesito que todos los parámetros estén en una cadena como un solo parámetro. El segundo ejemplo funciona si uso Request.QueryString. – Damien

+0

El primer ejemplo debería funcionar también, ¿lo intentó ?: var additionalParam = Form ["additionalParam"]; –

+0

Probé var content = $ ('. AdditionalParam'). Serialize()? ¿Es la forma ["additionalParam"] diferente? – Damien

0

de datos es un objeto

... 
data: { 
    x :$('#form').serialize(), 
    y:'something else' 
} 
... 
+0

Sí, el problema con esa forma era que consideraría x una propiedad de un objeto como en el segundo ejemplo. Lo cual, creo, atornilla el mapeo de las claves a las propiedades en MVC. – Damien

+0

quizás en lugar de usar serialize(), utilizando formSerialize() desde este complemento http://malsup.com/jquery/form/ –

0

Otra solución si quieres un diccionario de pares clave/valor:

public void TestMVC(MyObject obj, IDictionary<string, object> TheWeirdQueryString) 
{ 
} 

Cliente:.

function PostForm() { 
    $.ajax({ 
     url: "/Home/TestMVC", 
     type: "POST", 
     dataType: "application/JSON", 
     data: $('#form').serialize() + "&" + $('.additionalParams').serialize() 
    }); 
}; 

$ ('. AdditionalParams') serializar() Formato:

TheWeirdQueryString[0].Key=param0&TheWeirdQueryString[0].Value=value0&TheWeirdQueryString[1].Key=param1&TheWeirdQueryString[1].Value=value1&...&TheWeirdQueryString[n].Key=paramN&TheWeirdQueryString[n].Value=valueN 

ACTUALIZADO:

Es necesario algo como esto:

<input class="additionalParams" type="text" name="TheWeirdQueryString[0].Key" value="param0" /> 
<input class="additionalParams"type="text" name="TheWeirdQueryString[0].Value" value="value0" /> 
<!-- ... --> 
<input class="additionalParams"type="text" name="TheWeirdQueryString[n].Key" value="paramN" /> 
<input class="additionalParams"type="text" name="TheWeirdQueryString[n].Value" value="valueN" /> 
+0

ES que el formato POST debe ser o debo hacerlo yo mismo. Sigue haciendo clave: valor clave: valor en lugar de lo que publicaste – Damien

+0

He añadido un ejemplo de marcado HTML –

Cuestiones relacionadas