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

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

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

4b9b3361

Ответ 1

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

Пример:

[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, как вы упомянули выше.

Ответ 2

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

Ответ 3

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

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

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

Ответ 4

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