c# - net - Publicación simple a la API web
web api post example c# (1)
Estoy tratando de obtener una solicitud de publicación para trabajar con la API web. Lo siguiente es mi controlador de API.
public class WebsController : ApiController
{
[HttpPost]
public void PostOne(string id)
{
}
[HttpPost]
public void PostTwo(Temp id)
{
}
}
He alterado la ruta webapi para tener en cuenta la acción. el modelo Temp parece algo así.
public class Temp
{
public string Id { get; set; }
}
mi vista se ve algo como esto
@using (Ajax.BeginForm(new AjaxOptions
{
Url = "/api/webs/postone",
HttpMethod = "post"
}))
{
<input name="id" id="id" value="2" />
<input type="submit" value="submit" />
}
el código anterior no funciona en absoluto con el postone a menos que coloque el atributo [FromBody] delante del parámetro como este.
[HttpPost]
public void PostOne([FromBody]string id)
{
}
luego toca la acción, pero la identificación sigue siendo nula. No se llena con el valor en el cuadro de texto.
Pero, si cambio la Url
del Ajax.BeginForm
a posttwo
que toma el modelo Temp
, funciona bien y el campo Id
obtiene el valor correcto en el cuadro de texto.
¿alguien puede por favor explicarme la razón por la que esto sucede y cómo puedo publicar un valor simple para una acción de API web? Quiero decir, ¿por qué puede vincular un tipo complejo, pero no un tipo simple?
Ha pasado bastante tiempo desde que hice esta pregunta. Ahora que lo entiendo con más claridad, voy a dar una respuesta más completa para ayudar a los demás.
En la API web, es muy simple recordar cómo está ocurriendo el enlace de parámetros.
- si
POST
tipos simples, la API web intenta vincularlo desde la URL si
POST
tipo complejo, Web API intenta vincularlo desde el cuerpo de la solicitud (esto utiliza un formateador demedia-type
).Si desea vincular un tipo complejo de la URL, usará
[FromUri]
en su parámetro de acción. La limitación de esto se reduce a cuánto tiempo van a ser sus datos y si excede el límite de caracteres de url.public IHttpActionResult Put([FromUri] ViewModel data) { ... }
Si desea vincular un tipo simple del cuerpo de la solicitud, usará [FromBody] en su parámetro de acción.
public IHttpActionResult Put([FromBody] string name) { ... }
como nota al margen, digamos que está haciendo una solicitud PUT
(solo una cadena) para actualizar algo. Si decide no agregarlo a la URL y pasarlo como un tipo complejo con solo una propiedad en el modelo, entonces el parámetro de data
en jQuery ajax tendrá el siguiente aspecto. El objeto que pasa al parámetro de datos tiene solo una propiedad con un nombre de propiedad vacío.
var myName = ''ABC'';
$.ajax({url:.., data: {'''': myName}});
y su acción de API web se verá más abajo.
public IHttpActionResult Put([FromBody] string name){ ... }
Esta página de asp.net lo explica todo. http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api