2009-06-16 4 views
6

Se si esegue la serializzazione di un modulo utilizzando qualcosa come jQuery, esso mappa spesso le chiavi e i valori JSON alle proprietà di un oggetto sull'azione del controller su cui si sta effettuando la registrazione. Quindi:Invio di più elementi al controller MVC tramite jQuery.Ajax

jQuery:

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

Presumendo dettagli principali contiene elementi che avranno il nome del parametro come una chiave che dovrebbero mappare l'oggetto direttamente:

Azione:

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

POST:

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

Qualcuno sa come funziona? Si sta rompendo ogni volta che passo il modulo e qualsiasi altro dato al controller.

Desidero inviare il contenuto dei dati nonché una QueryString che potrebbe contenere qualsiasi numero e tipo di coppie chiave/valore per il controller. Posso estrarre queste coppie chiave/valore sul server poiché non posso creare un oggetto per loro sulla firma del metodo. Tuttavia, questo non funziona come previsto.

jQuery:

function PostForm() { 

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

Azione:

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

Messaggio:

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

Credo che questo è perché ho fatto creato un oggetto JSON come dati e impostare le proprietà al nome dell'oggetto.

C'è una differenza nei valori POST che appaiono in Firebug. Quando posto solo l'oggetto, i valori POST sono tutte le chiavi dell'oggetto/modulo con i loro valori corrispondenti. Nel secondo esempio ci sono due semplici proprietà, il nome che ho dato loro, ognuna contenente una QueryString (Foo=1&Bar=2) e MVC non può mappare una QueryString ai membri di un oggetto (o così apparirebbe).

È comunque necessario iniziare a lavorare come fa in primo luogo, ma anche inviare dati aggiuntivi a un secondo argomento sull'azione? Sto indovinando che è di aggiungere una proprietà in più a tutti quelli esistenti creati quando jquery esegue la serializzazione del modulo.

Il POST Io in realtà voglio è:

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

Puoi pubblicare i valori post che stai vedendo per entrambi gli scenari? Non capisco la tua descrizione. –

+0

Fatto. L'ultimo esempio è il post che sto cercando di fare. – Damien

risposta

5

parametro dataType a $ .ajax metodo è il tipo di risposta (il tipo di dati che vi aspettate dal server), non è richiesta.Prova a modificare:

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

aggiornamento:

Prova questa:

Controller:

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

Cliente:

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

ma sul lato client tuoi params aggiuntivo deve essere nel seguente formato:

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

modo $ ('. AdditionalParams') gli elementi devono avere "id" e/o "nome" attributi come: TheWeirdQueryString [1], TheWeirdQueryString [2] ... TheWeirdQueryString [N]

Spero che questo aiuti

+0

Il risultato jquery riceve un oggetto JSON, I miei riferimenti erano perché pensavo che {} per i dati creasse un oggetto JSON? Il primo esempio non funziona. È sufficiente aggiungere quei parametri al primo oggetto in cui ho bisogno che tutti i parametri siano in una stringa come un singolo parametro. Il secondo esempio funziona se utilizzo Request.QueryString. – Damien

+0

Anche il primo esempio dovrebbe funzionare: ci hai provato ?: var additionalParam = Form ["additionalParam"]; –

+0

Ho provato var content = $ ('. AdditionalParam'). Serialize()? La forma ["additionalParam"] è diversa? – Damien

0

dei dati è un oggetto

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

Sì, il problema in quel modo era che avrebbe considerato x una proprietà di un oggetto come nel 2 ° esempio. Quale, penso, avvita la mappatura delle chiavi alle proprietà su MVC. – Damien

+0

forse invece di utilizzare serialize(), utilizzando formSerialize() da questo plug-in http://malsup.com/jquery/form/ –

0

Un'altra soluzione se si vuole un dizionario di coppie chiave/valore:

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') serializzare() 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 

AGGIORNATO:

Hai bisogno di qualcosa di simile:

<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

È che cosa dovrebbe essere il formato POST o devo fare il formato da solo. Continua a fare la chiave: valore chiave: valore invece di ciò che hai postato – Damien

+0

Ho aggiunto un esempio di markup HTML –