2016-10-07 5 views
2

Я не хочу связывать свойство Id на моем CustomerViewModel, поэтому я добавил атрибут [BindNever], но он не работает. Что может быть решением?Почему атрибут BindNever не работает

У меня есть следующие:

CustomerController.cs

// PUT api/customers/5 
[HttpPut("{id}")] 
public async Task<IActionResult> Put([FromUri] int id, [FromBody]CustomerViewModel customer) 
{ 
    //Implementation 
} 

CustomerViewModel

public class CustomerViewModel 
{ 
    [BindNever] 
    public int Id { get; set; } 
    public string LastName { get; set; } 
    public string FirstName { get; set; } 
    public string Email { get; set; } 
} 

Если я введите следующие JSON. Свойство id еще получает переплетены

{ 
    "id": 100, 
    "lastName": "Bruce", 
    "firstName": "Wayne", 
    "email": "[email protected]" 
} 

ответ

4

Этого Blog post является интересным для чтения и делает вывод о том, что [FromBody] аннотации «отменяет» BindBehaviourAttribute (BindNever простой специализация). Модель заполнена всеми данными, доступными из тела (ваши данные JSON в этом случае).

Я не считаю это интуитивно, и issue имеет хорошее заявление об этом:

[BindRequired] настраивает систему привязки MVC модель. Это его цель , и он работает как разработанный.

[FromBody] переключает затронутое свойство или параметр в формат ввода данных . Каждый входной форматтер (например, Json.NET и небольшая MVC-специфичная обертка) можно рассматривать как отдельную систему с собственной настройкой. Система привязки модели не знает подробностей десериализации JSON (или любой другой).

Услышано: BindNever не работает в этом сценарии.

Что такое альтернативы?

Решение 1: Написание специального кода привязки модели. Я не сделал это сам, но может помочь What is the correct way to create custom model binders in MVC6?.

Решение 2: Довольно прагматичная один

Возможно, это просто (но не очень приятно) обходной путь помогает вам:

[HttpPut("{id}")] 
public async Task<IActionResult> Put([FromUri] int id, [FromBody]CustomerViewModel customer) 
{ 
    customer.Id = 0; 
    //Implementation 
} 
+0

Конфиденциальный сеттер, кажется, сделать трюк. Я не могу подтвердить свое решение. Я попытался оглянуться, чтобы найти что-то подобное, но не повезло. –