EDIT : 31/10/2017
O mesmo código / abordagem também funcionará para o Asp.Net Core 2.0 . A principal diferença é que, no núcleo do asp.net, os controladores da API da Web e os controladores Mvc são mesclados no modelo de controlador único. Portanto, o seu tipo de retorno pode ser IActionResult
ou um de sua implementação (Ex: OkObjectResult
)
Usar
contentType:"application/json"
Você precisa usar o JSON.stringify
método para convertê-lo em string JSON ao enviá-lo,
E o fichário do modelo vinculará os dados json ao seu objeto de classe.
O código abaixo funcionará bem (testado)
$(function () {
var customer = {contact_name :"Scott",company_name:"HP"};
$.ajax({
type: "POST",
data :JSON.stringify(customer),
url: "api/Customer",
contentType: "application/json"
});
});
Resultado
contentType
A propriedade informa ao servidor que estamos enviando os dados no formato JSON. Como enviamos uma estrutura de dados JSON, a ligação do modelo ocorrerá corretamente.
Se você inspecionar os cabeçalhos da solicitação ajax, poderá ver que o Content-Type
valor está definido como application/json
.
Se você não especificar explicitamente contentType, ele usará o tipo de conteúdo padrão que é application/x-www-form-urlencoded;
Edite em novembro de 2015 para resolver outros possíveis problemas levantados nos comentários
Postando um objeto complexo
Digamos que você tenha uma classe de modelo de exibição complexa como seu parâmetro do método de ação da API da web, como este
public class CreateUserViewModel
{
public int Id {set;get;}
public string Name {set;get;}
public List<TagViewModel> Tags {set;get;}
}
public class TagViewModel
{
public int Id {set;get;}
public string Code {set;get;}
}
e seu ponto final da API da Web é como
public class ProductController : Controller
{
[HttpPost]
public CreateUserViewModel Save([FromBody] CreateUserViewModel m)
{
// I am just returning the posted model as it is.
// You may do other stuff and return different response.
// Ex : missileService.LaunchMissile(m);
return m;
}
}
No momento da redação deste artigo, o ASP.NET MVC 6 é a versão estável mais recente e, no MVC6, os controladores de API da Web e os MVC estão herdando da Microsoft.AspNet.Mvc.Controller
classe base.
Para enviar dados para o método do lado do cliente, o código abaixo deve funcionar bem
//Build an object which matches the structure of our view model class
var model = {
Name: "Shyju",
Id: 123,
Tags: [{ Id: 12, Code: "C" }, { Id: 33, Code: "Swift" }]
};
$.ajax({
type: "POST",
data: JSON.stringify(model),
url: "../product/save",
contentType: "application/json"
}).done(function(res) {
console.log('res', res);
// Do something with the result :)
});
A ligação de modelo funciona para algumas propriedades, mas não para todas! Por quê ?
Se você não decorar o parâmetro do método API da Web com o [FromBody]
atributo
[HttpPost]
public CreateUserViewModel Save(CreateUserViewModel m)
{
return m;
}
E envie o modelo (objeto javascript bruto, não no formato JSON) sem especificar o valor da propriedade contentType
$.ajax({
type: "POST",
data: model,
url: "../product/save"
}).done(function (res) {
console.log('res', res);
});
A ligação do modelo funcionará para as propriedades simples do modelo, não para as propriedades em que o tipo é complexo / outro tipo. No nosso caso, Id
e as Name
propriedades serão corretamente vinculadas ao parâmetro m
, mas a Tags
propriedade será uma lista vazia.
O mesmo problema ocorrerá se você estiver usando a versão curta, $.post
que usará o Tipo de Conteúdo padrão ao enviar a solicitação.
$.post("../product/save", model, function (res) {
//res contains the markup returned by the partial view
console.log('res', res);
});
Trabalhar com POST em webapi pode ser complicado! Gostaria de adicionar à resposta já correta ..
O foco será especificamente no POST, pois lidar com GET é trivial. Eu não acho que muitos estariam procurando ao redor para resolver um problema com GET com webapis. Enfim..
Se sua pergunta for - No MVC Web Api, como- - Usar nomes de métodos de ação personalizados que não sejam os verbos HTTP genéricos? - Executar várias postagens? - Publicar vários tipos simples? - Publique tipos complexos via jQuery?
Em seguida, as seguintes soluções podem ajudar:
Primeiro, para usar métodos de ação personalizados na API da Web, adicione uma rota de API da Web como:
E então você pode criar métodos de ação como:
Agora, ative o seguinte jQuery no console do navegador
Segundo, para executar várias postagens , é simples, crie vários métodos de ação e decore com o atributo [HttpPost]. Use o [ActionName ("MyAction")] para atribuir nomes personalizados, etc. Chegará ao jQuery no quarto ponto abaixo
Terceiro, primeiro de tudo, não é possível postar vários tipos SIMPLE em uma única ação. Além disso, existe um formato especial para postar até um único tipo simples (além de passar o parâmetro na string de consulta ou no estilo REST). Esse foi o ponto que me fez bater de cabeça com os clientes Rest (como o Fiddler e a extensão de cliente REST avançada do Chrome) e procurar na web por quase 5 horas, quando, eventualmente, o URL a seguir se mostrou útil. Citará o conteúdo relevante para o link pode ficar morto!
PS: Percebeu a sintaxe peculiar ?
http://forums.asp.net/t/1883467.aspx?The+received+value+is+null+when+I+try+to+Post+to+my+Web+Api
De qualquer forma, vamos superar essa história. Se movendo:
Em quarto lugar, a publicação de tipos complexos via jQuery, é claro, $ .ajax () assumirá prontamente a função:
Digamos que o método de ação aceite um objeto Pessoa que tenha um ID e um nome. Então, do javascript:
E a ação será semelhante a:
Todos os itens acima, funcionaram para mim !! Felicidades!
fonte
Acabei de brincar com isso e descobri um resultado bastante estranho. Digamos que você tenha propriedades públicas em sua classe em C # assim:
você deve executar o truque JSON.stringify, conforme sugerido por Shyju, e chamá-lo assim:
No entanto, se você definir getters e setters em sua classe, desta forma:
então você pode chamá-lo muito mais simplesmente:
Isso usa o cabeçalho HTTP:
Não sei bem o que está acontecendo aqui, mas parece um bug (recurso?) No quadro. Presumivelmente, os diferentes métodos de ligação estão chamando "adaptadores" diferentes e, enquanto o adaptador para application / json trabalha com propriedades públicas, o dos dados codificados por formulário não.
Não tenho idéia do que seria considerado uma boa prática.
fonte
Use o JSON.stringify () para obter a sequência no formato JSON, assegure-se de que, ao fazer a chamada AJAX, você passe abaixo dos atributos mencionados:
Abaixo está o código give jquery para fazer ajax post call para asp.net web api:
fonte
Certifique-se de que seu serviço WebAPI esteja esperando um objeto fortemente tipado com uma estrutura que corresponda ao JSON que você está passando. E certifique-se de especificar o JSON que você está postando.
Aqui está o meu JavaScript (usando o AngluarJS):
E aqui está o meu controlador WebAPI:
fonte
Código a seguir para retornar dados no formato json, em vez da xml -Web API 2: -
Coloque a seguinte linha no arquivo Global.asax
fonte
fonte
A Microsoft deu um bom exemplo disso:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-1
Primeiro valide a solicitação
e depois usar os dados serializados.
Aqui 'Status' é um campo no tipo complexo. A serialização é feita pelo .NET, não é preciso se preocupar com isso.
fonte
1) No lado do cliente, você pode enviar uma solicitação http.post na string como abaixo
2) Em seguida, no seu controlador de API da web, você pode desserializá-lo
3) Sua classe ApiReceivedListOfObjects deve ser como abaixo
4) verifique se a string serializada (IndexInfo aqui) fica como abaixo da estrutura antes do comando JsonConvert.DeserializeObject na etapa 2
fonte