Привязка модели Web API

Учитывая маршрут веб-API ASP.NET:

example/{Id}

Который соответствует следующему методу действия ApiController:

public void Example(Model m)
{
    ...
}

С классом модели, определенным как:

public class Model
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Когда я публикую JSON { "Name": "Testing" } на URL /example/123 затем Id собственность Model объект не связан. Это остается как 0 вместо 123.

Как сделать так, чтобы привязка модели также включала значения из данных маршрута? Я бы предпочел не писать собственные привязки моделей для того, что кажется обычным делом. Любые идеи очень приветствуются. Спасибо!

4 ответа

Самый простой способ выполнить то, что вы ищете, это просто добавить еще один параметр в ваш метод и указать, какой параметр поступает из какой части запроса.

Пример:

[HttpPost]
public void Example([FromUri]int id, [FromBody]Model m) {
    // ...
}

Теперь ваш маршрут /examples/{id} успешно сможет связать - потому что Example Метод имеет параметр с именем id который он ищет в URI. Чтобы заполнить вашу модель, вы можете либо передать туда идентификатор, либо сделать что-то вроде следующего:

[HttpPost]
public void Example([FromUri]int id, [FromBody]Model m) {
    m.Id = id; // Make sure the model gets the ID as well.
}

Тогда просто пост в { "Name": "Testing" } в /example/123 как вы упомянули выше.

Наша встроенная инфраструктура ModelBinding не поддерживает частичное связывание объекта как из URI, так и из тела. Вы можете, однако, реализовать пользовательский IActionValueBinder для выполнения этой задачи. Например, обратитесь к сообщению в блоге http://blogs.msdn.com/b/jmstall/archive/2012/04/18/mvc-style-parameter-binding-for-webapi.aspx.

Предлагаемый процесс для этого обычно отправлять /example вместо /example/{id}, (хотя с веб-API они обычно используют /api/{controller})

Проверьте таблицу на полпути вниз по этой странице: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

Также проверьте эту ссылку в разделе "Вставка записи с ASP.NET Web API" - http://stephenwalther.com/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx

Я не думаю, что механизм связывания по умолчанию может связать ваше значение маршрута Id со свойством Model Id, так что любой ответ d1k_is настолько хорош, насколько это возможно, я боюсь; либо это, либо написание своего собственного связующего (возможно, вы сможете написать более общее связующее? - если у вас есть суперкласс DomainEntity или что-то в этом роде...)

Другие вопросы по тегам