Подтвердить что ты не робот

Простая публикация в Web Api

Я пытаюсь получить почтовый запрос для работы с веб-api. Ниже приведен мой контроллер api.

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

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

Я изменил маршрут webapi, чтобы принять во внимание действие. модель Temp выглядит примерно так.

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? Я имею в виду, почему он может связывать сложный тип, но не простой тип.

4b9b3361

Ответ 1

Это было довольно давно, так как я задал этот вопрос. Теперь я понимаю это более четко, я собираюсь дать более полный ответ, чтобы помочь другим.

В Web API очень просто запомнить, как происходит привязка параметров.

  • если вы POST простые типы, веб-API пытается связать его с URL-адресом
  • если вы POST сложный тип, веб-API пытается связать его с телом запрос (используется форматер media-type).

  • Если вы хотите связать сложный тип с URL-адресом, вы будете использовать [FromUri] в своем действии. Ограничение этого зависит от того, как долго будут ваши данные и если он превысит лимит символов URL.

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

  • Если вы хотите связать простой тип с телом запроса, вы будете использовать [FromBody] в своем действии.

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

как побочная заметка, скажем, вы делаете запрос PUT (просто строку), чтобы что-то обновить. Если вы решите не добавлять его к URL-адресу и передавать как сложный тип с одним свойством в модели, то параметр data в jQuery ajax будет выглядеть примерно так. Объект, который вы передаете параметру данных, имеет только одно свойство с пустым именем свойства.

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