Estou tentando passar uma matriz de objetos em um método de controlador MVC usando a função ajax () do jQuery. Quando entro no método do controlador PassThing () C #, o argumento "coisas" é nulo. Eu tentei isso usando um tipo de lista para o argumento, mas também não funciona. O que estou fazendo de errado?
<script type="text/javascript">
$(document).ready(function () {
var things = [
{ id: 1, color: 'yellow' },
{ id: 2, color: 'blue' },
{ id: 3, color: 'red' }
];
$.ajax({
contentType: 'application/json; charset=utf-8',
dataType: 'json',
type: 'POST',
url: '/Xhr/ThingController/PassThing',
data: JSON.stringify(things)
});
});
</script>
public class ThingController : Controller
{
public void PassThing(Thing[] things)
{
// do stuff with things here...
}
public class Thing
{
public int id { get; set; }
public string color { get; set; }
}
}
c#
asp.net-mvc
jquery
idílico
fonte
fonte
Respostas:
Usando a sugestão de NickW, consegui fazer isso funcionar usando
things = JSON.stringify({ 'things': things });
Aqui está o código completo.Aprendi duas coisas com isso:
As configurações contentType e dataType são absolutamente necessárias na função ajax (). Não funcionará se eles estiverem faltando. Descobri isso depois de muita tentativa e erro.
Para passar uma matriz de objetos para um método de controlador MVC, simplesmente use o formato JSON.stringify ({'coisas': coisas}).
Espero que isto ajude alguém!
fonte
http://localhost:52459/Sales/completeSale?itemsInCart=[{"ItemId":1,"Quantity":"1","Price":3.5}]
eSales.completeSale
épublic ActionResult completeSale(ItemInCart[] itemsInCart)
anotado como umHttpGet
.data: JSON.stringify(things),
dataType
não é necessário. Se for omitido, a função ajax trabalhará com base nos dados de retornoVocê não poderia simplesmente fazer isso?
... e marque sua ação com
fonte
A formatação de seus dados pode ser o problema. Experimente um destes:
Ou (em Como posso postar uma matriz de string no ASP.NET MVC Controller sem um formulário? )
fonte
Estou usando um aplicativo da Web .Net Core 2.1 e não consegui obter uma única resposta aqui para funcionar. Ou obtive um parâmetro em branco (se o método foi chamado) ou um erro 500 do servidor. Comecei a brincar com todas as combinações possíveis de respostas e finalmente consegui um resultado de trabalho.
No meu caso, a solução foi a seguinte:
Script - restringe a matriz original (sem usar uma propriedade nomeada)
E no método do controlador, use [FromBody]
As falhas incluem:
Nomeando o conteúdo
dados: {conteúdo: nós}, // Erro de servidor 500
Não tendo contentType = Erro de servidor 500
Notas
dataType
não é necessário, apesar do que algumas respostas dizem, pois isso é usado para a decodificação da resposta (portanto, não é relevante para os exemplos de solicitação aqui).List<Thing>
também funciona no método do controladorfonte
Eu tenho uma resposta perfeita para tudo isso: eu tentei tantas soluções, mas não consegui me tornar finalmente capaz de gerenciar, por favor encontre a resposta detalhada abaixo:
Controler
fonte
A única maneira de fazer isso funcionar é passar o JSON como uma string e, em seguida, desserializar usando
JavaScriptSerializer.Deserialize<T>(string input)
, o que é muito estranho se esse for o desserializador padrão para MVC 4.Meu modelo tem listas aninhadas de objetos e o melhor que consegui usando dados JSON é a lista superior para ter o número correto de itens, mas todos os campos nos itens eram nulos.
Esse tipo de coisa não deve ser tão difícil.
fonte
Este é um código de trabalho para sua consulta, você pode usá-lo.
Controler
javascript
fonte
Envolver sua lista de objetos com outro objeto contendo uma propriedade que corresponda ao nome do parâmetro que é esperado pelo controlador MVC funciona. A parte importante é o wrapper em torno da lista de objetos.
fonte
fonte
Se você estiver usando a API Web ASP.NET, então você deve apenas passar
data: JSON.stringify(things)
.E seu controlador deve ser parecido com isto:
fonte
Modificação de @veeresh i
fonte
O que eu fiz ao tentar enviar alguns dados de várias linhas selecionadas em DataTable para ação MVC:
HTML no início de uma página:
(apenas uma linha é mostrada, vincular do modelo):
Botão que inicia a função JavaScript:
Função JavaScript:
Ação MVC:
E MODEL em C #:
CONCLUSÃO:
O motivo do ERRO:
É atributo:
[ValidateAntiForgeryToken]
para a ação MVCStartWorkflow
Solução em chamada Ajax:
Para enviar a Lista de objetos você precisa formar dados como no exemplo (preenchendo o objeto da lista) e:
dados: {modelo: lista},
tipo: "post",
fonte
É assim que funciona bem para mim:
Com "ContentType" em "C" maiúsculo.
fonte