Domanda

Se stai serializzando un modulo usando qualcosa come jQuery, spesso mapperà le chiavi e i valori JSON sulle proprietà di un oggetto nell'Azione Controller a cui stai postando. Quindi:

jQuery:

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

Presumendo che i dettagli principali contengano elementi che avranno il nome del parametro come chiave da mappare direttamente sull'oggetto:

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 interrompe ogni volta che passo il modulo e tutti i dati aggiuntivi al controller.

Vorrei inviare il contenuto dei dati e una QueryString che potrebbe contenere qualsiasi numero e tipo di coppia chiave / valore al controller. Posso estrarre queste coppie chiave / valore sul server poiché non riesco a 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

Penso che ciò sia dovuto al fatto che ho effettivamente creato un oggetto JSON come Dati e impostato le proprietà sul nome dell'oggetto.

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

Esiste comunque un modo per lavorare come fa in prima istanza, ma anche per inviare dati extra a un secondo argomento sull'Azione? Immagino che sia aggiungere una proprietà in più a tutti quelli esistenti creati quando jquery esegue la serializzazione del modulo.

Il POST che voglio davvero è:

Name: "Bob"
Age: "999"
Sex: "Unknown"
TheWeirdQueryString: param1=1&param2=2
È stato utile?

Soluzione

Il parametro dataType nel metodo $ .ajax è il tipo di risposta (il tipo di dati che ti aspetti dal server), non la richiesta. Prova invece questo:

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 questo:

Controller:

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

Cliente:

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

ma sul lato client i parametri aggiuntivi devono essere nel seguente formato:

<*>

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

Spero che questo aiuti

Altri suggerimenti

I dati sono un oggetto

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

Un'altra soluzione se si desidera 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'). serialize () 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

AGGIORNAMENTO:

Hai bisogno di qualcosa del genere:

<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" />
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top