Pergunta

Se youa são serialização de um formulário usando algo como jQuery, que muitas vezes vai mapear as chaves JSON e valores para as propriedades de um objeto sobre a ação do controlador que você está postando. Assim:

jQuery:

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

Presumindo principais detalhes contém elementos que terão o nome do parâmetro como uma chave que devem mapear para o objeto diretamente:

ação:

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

POST:

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

Alguém sabe como isso funciona? É quebra cada vez passe a forma e quaisquer dados adicionais para o controlador.

Eu gostaria de enviar o conteúdo dos dados, bem como uma QueryString que poderia conter qualquer número e os tipos de pares de chave / valor para o controlador. Posso extrair esses pares de chave / valor no servidor já que não posso criar um objeto por eles na assinatura do método. No entanto, este não funcionar como pretendido.

jQuery:

function PostForm() {

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

ação:

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

Post:

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

Eu acho que isso é porque eu tenho realmente criado um objeto JSON como os dados e defina as propriedades para o nome do objeto.

Há uma diferença nos valores POST que aparecem no Firebug. Quando eu postar o objeto sozinho, os valores POST são todas as chaves do objeto / form com seus valores correspondentes. No segundo exemplo, há duas propriedades simples, o nome que dei-lhes, cada uma contendo uma QueryString (Foo=1&Bar=2) e MVC não pode mapear uma QueryString para os membros de um objeto (ou assim parece).

Existe uma maneira em tudo para começar a trabalhar como ele faz, em primeira instância, mas também para enviar dados adicionais para um segundo argumento na ação? Eu estou supondo que é para adicionar uma propriedade extra a todos os existentes criados quando jquery faz a serialização do formulário.

O POST que eu realmente quero é:

Name: "Bob"
Age: "999"
Sex: "Unknown"
TheWeirdQueryString: param1=1&param2=2
Foi útil?

Solução

dataType parâmetro no método $ .ajax é o tipo de resposta (o tipo de dados que você está esperando de volta do servidor), não pedido. Tente isto em vez disso:

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

ou

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

ATUALIZADO:

Tente isto:

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

mas no lado do cliente seus parâmetros adicionais devem estar no seguinte formato:

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

para $ ('. AdditionalParams') elementos devem ter "id" e / ou "nome" atributos como: TheWeirdQueryString [1], TheWeirdQueryString [2] ... TheWeirdQueryString [N]

Espero que isso ajude

Outras dicas

Os dados é um objeto

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

Outra solução se você quiser um dicionário de pares chave / 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 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

ATUALIZADO:

Você precisa de algo como isto:

<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" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top