web-dev-qa-db-fra.com

Post simple à Web Api

J'essaie d'obtenir une demande de publication pour travailler avec l'API Web. Voici mon contrôleur d'api.

public class WebsController : ApiController
{
    [HttpPost]
    public void PostOne(string id)
    {
    }

    [HttpPost]
    public void PostTwo(Temp id)
    {
    }
}

J'ai modifié la route webapi pour prendre en compte l'action. le modèle Temp ressemble à quelque chose comme ça.

public class Temp
{
    public string Id { get; set; }
}

ma vue a quelque chose comme ça

@using (Ajax.BeginForm(new AjaxOptions
{
    Url = "/api/webs/postone",
    HttpMethod = "post"
}))
{
    <input name="id" id="id" value="2" />
    <input type="submit" value="submit" />
}

le code ci-dessus ne fonctionne pas du tout avec le postone à moins que je mette l'attribut [FromBody] devant le paramètre comme ceci.

[HttpPost]
public void PostOne([FromBody]string id)
{
}

alors il frappe l'action, mais l'identifiant est toujours nul. Il n'est pas renseigné avec la valeur dans la zone de texte.

Mais, si je change le Url du Ajax.BeginForm en posttwo qui prend le modèle Temp, cela fonctionne bien et le champ Id prend la valeur appropriée dans la zone de texte.

quelqu'un peut-il m'expliquer s'il vous plaît la raison de cette situation et comment puis-je publier une valeur simple pour une action API Web? Je veux dire, pourquoi peut-il lier un type complexe mais pas un type simple.

69
Amila

Cela fait assez longtemps que j'ai posé cette question. Maintenant, je le comprends plus clairement, je vais donner une réponse plus complète pour aider les autres.

Dans les API Web, il est très simple de se rappeler comment se fait la liaison de paramètres.

  • si vous POST types simples, Web API tente de le lier à partir de l'URL
  • si vous POST type complexe, Web API tente de la lier à partir du corps de la demande (elle utilise un formateur media-type.).

  • Si vous souhaitez lier un type complexe à partir de l'URL, vous utiliserez [FromUri] dans votre paramètre d'action. La limite de ceci est liée à la longueur de vos données et si elles dépassent la limite de caractères url.

    public IHttpActionResult Put([FromUri] ViewModel data) { ... }

  • Si vous souhaitez lier un type simple à partir du corps de la demande, vous utiliserez [FromBody] dans votre paramètre d'action.

    public IHttpActionResult Put([FromBody] string name) { ... }

en guise de remarque, disons que vous faites une demande PUT (juste une chaîne) pour mettre à jour quelque chose. Si vous décidez de ne pas l'ajouter à l'URL et de passer comme type complexe avec une seule propriété dans le modèle, le paramètre data de jQuery ajax ressemblera à ce qui suit. L'objet que vous transmettez au paramètre data n'a qu'une propriété avec un nom de propriété vide.

var myName = 'ABC';
$.ajax({url:.., data: {'': myName}});

et votre action web api ressemblera à quelque chose comme ci-dessous.

public IHttpActionResult Put([FromBody] string name){ ... }

Cette page asp.net explique tout. http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

109
Amila