Привязка модели 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 или что-то в этом роде...)