Простой пост в веб-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 64

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