Простой пост в веб-Api
Я пытаюсь получить запрос post для работы с веб-api. Ниже приведен мой контроллер api.
public class WebsController : ApiController
{
[HttpPost]
public void PostOne(string id)
{
}
[HttpPost]
public void PostTwo(Temp id)
{
}
}
Я изменил маршрут webapi, чтобы принять во внимание это действие. временная модель выглядит примерно так.
public class Temp
{
public string Id { get; set; }
}
мой взгляд выглядит примерно так
@using (Ajax.BeginForm(new AjaxOptions
{
Url = "/api/webs/postone",
HttpMethod = "post"
}))
{
<input name="id" id="id" value="2" />
<input type="submit" value="submit" />
}
приведенный выше код вообще не работает с postone, если я не помещаю атрибут [FromBody] перед параметром, как это.
[HttpPost]
public void PostOne([FromBody]string id)
{
}
затем он попадает в действие, но идентификатор по-прежнему равен нулю. Он не заполняется значением в текстовом поле.
но, если я изменю Url
на Ajax.BeginForm
до posttwo
которые берут модель Temp
, он прекрасно работает и Id
поле получает правильное значение в текстовом поле.
может ли кто-нибудь объяснить мне причину этого и как я могу опубликовать простое значение для действия веб-api? Я имею в виду, почему он может связать сложный тип, но не простой тип.
1 ответ:
это было довольно давно, так как я задал этот вопрос. Теперь я понимаю это более ясно, я собираюсь поставить более полный ответ, чтобы помочь другим.
в Web API очень просто запомнить, как происходит привязка параметров.
- если вы
POST
простые типы, Web API пытается связать его с URLесли вы
POST
сложный тип, Web API пытается связать его с телом запрос (это используетmedia-type
форматер.)если вы хотите привязать сложный тип из URL, вы будете использовать
[FromUri]
в параметре action. Ограничение этого сводится к тому, как долго будут храниться ваши данные, и если они превышают ограничение символов url.
public IHttpActionResult Put([FromUri] ViewModel data) { ... }
если вы хотите связать простой тип из тела запроса, вы будете использовать [FromBody] в параметр action.
public IHttpActionResult Put([FromBody] string name) { ... }
как побочный обратите внимание, скажем, вы делаете
PUT
запрос (просто строка), чтобы что-то обновить. Если вы решили не добавлять его в URL-адрес и передать как сложный тип только с одним свойством в модели, тоdata
параметр в jQuery ajax будет выглядеть примерно так, как показано ниже. Объект, передаваемый параметру data, имеет только одно свойство с пустым именем свойства.var myName = 'ABC'; $.ajax({url:.., data: {'': myName}});
и ваше действие веб-api будет выглядеть примерно так, как показано ниже.
public IHttpActionResult Put([FromBody] string name){ ... }
на этой странице ASP.NET объясняет все это. http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api