Estou criando um pequeno aplicativo para me ensinar o ASP.NET MVC e JQuery, e uma das páginas é uma lista de itens nos quais alguns podem ser selecionados. Gostaria de pressionar um botão e enviar uma lista (ou algo equivalente) ao meu controlador contendo os IDs dos itens que foram selecionados, usando a função Post do JQuery.
Consegui obter uma matriz com os IDs dos elementos que foram selecionados e agora quero publicá-la. Uma maneira de fazer isso é ter um formulário fictício na minha página, com um valor oculto, e depois definir o valor oculto com os itens selecionados, e postar esse formulário; isso parece sujo, no entanto.
Existe uma maneira mais limpa de conseguir isso, enviando a matriz diretamente para o controlador? Eu tentei algumas coisas diferentes, mas parece que o controlador não pode mapear os dados que está recebendo. Aqui está o código até agora:
function generateList(selectedValues) {
var s = {
values: selectedValues //selectedValues is an array of string
};
$.post("/Home/GenerateList", $.toJSON(s), function() { alert("back") }, "json");
}
E então meu controlador fica assim
public ActionResult GenerateList(List<string> values)
{
//do something
}
Tudo o que consegui obter é um "nulo" no parâmetro do controlador ...
Alguma dica?
fonte
Request["values[]"]
Respostas:
Modifiquei minha resposta para incluir o código de um aplicativo de teste que fiz.
Atualização: atualizei o jQuery para definir a configuração "tradicional" como true, para que funcione novamente (por resposta de @DustinDavis).
Primeiro o javascript:
E aqui está o código na minha classe de controlador:
Quando chamo essa função javascript, recebo um alerta dizendo "Primeiro item da lista: 'item1'". Espero que isto ajude!
fonte
dataType: 'JSON'
faz com que o jQuery tente analisar a resposta como JSON, e ocorrerá um erro se não for JSON válido.dataType: 'json'
é para o tipo de retorno e não é necessário enviar a matriz para Action.contentType: "application/json; charset=utf-8"
, é esse, mas em alguns casos como esse não é necessário.var postData = { id: 45, [{myClassProp1: 1, myClassProp2: 2}, {}...], anotherParam: "some string" };
FYI: JQuery mudou a maneira como eles serializam os dados de postagem.
http://forum.jquery.com/topic/nested-param-serialization
Você deve definir a configuração "Tradicional" como verdadeira, caso contrário
vai sair como
ao invés de
fonte
$.ajax({ ..., traditional: true});
ajudará a reverter para a serialização tradicional.ints
. Quando eu usotraditional: true
, ele funciona, sua resposta e link explicam o porquê disso. Também funciona quando eu usotype: "POST"
, sem usartraditional: true
. Por que é que? Poderia, por favor, elaborar. Para sua informação, estou usando o Asp.Net Mvc.Obrigado a todos pelas respostas. Outra solução rápida será usar o método jQuery.param com o parâmetro tradicional definido como true para converter o objeto JSON em string:
fonte
Não poste os dados como uma matriz. Para vincular a uma lista, os pares chave / valor devem ser enviados com o mesmo valor para cada chave.
Você não precisa de um formulário para fazer isso. Você só precisa de uma lista de pares de chave / valor, que você pode incluir na chamada para $ .post.
fonte
In
.NET4.5
,MVC 5
Javascript:
objeto em JS:
mecanismo que publica.
C #
Objetos:
Controlador:
Objeto recebido:
Espero que isso poupe algum tempo.
fonte
Outra implementação que também está trabalhando com lista de objetos, não apenas cadeias de caracteres:
JS:
Supondo que 'selectedValues' seja Array of Objects.
No controlador, o parâmetro é uma lista dos ViewModels correspondentes.
fonte
Como discuti aqui ,
se você deseja passar o objeto JSON personalizado para a ação MVC, pode usar esta solução, ela funciona como um encanto.
O benefício real desta solução é que você não precisa definir uma nova classe para cada combinação de argumentos e, além disso, pode converter seus objetos em seus tipos originais facilmente.
Você pode usar um método auxiliar como este para facilitar seu trabalho:
fonte
Você pode configurar o parâmetro global com
fonte
A resposta me ajudou muito na minha situação, então obrigado por isso. No entanto, para referência futura, as pessoas devem vincular-se a um modelo e validar. Este post de Phil Haack descreve isso para o MVC 2. http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx
Espero que isso ajude alguém.
fonte