Атрибут [Bind (Exclude = “”)] не может предотвратить чрезмерную публикацию

Каков наилучший способ предотвратить перепост MVC 4?

Согласно источникам MS, атрибут [Bind] должен быть самым простым способом предотвращения чрезмерной публикации, не позволяя входящим значениям формы попадать в базу данных. С последней версией MVC & EF, кажется, не работает, как ожидалось / рекламируется, если я неМне не хватает чего-то серьезного.

ОтWrox Professional ASP.NET MVC 4 (Джон Галлоуэйs Глава 7), следующий класс должен предотвращать чрезмерную публикацию:

[Bind(Exclude="IsAdmin")]
public class User
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public bool IsAdmin { get; set; }
}

Но все атрибут [Bind] предотвращает привязку значений представления формы к модели. Модель тогда имеет пустое значение / значение по умолчанию, которое записывается обратно в базу данных. В этом случае он будет гарантировать, что IsAdmin = false КАЖДЫЙ РАЗ, когда вы вызываете .SaveChanges (), используя эту модель. Любой "правда" значения перезаписываются Тот'ОГРОМНАЯ ошибка безопасности.

Альтернативный синтаксис - размещение [Bind] в параметре действия контроллера Edit - делает то же самое:

public ActionResult Edit([Bind(Exclude = "IsAdmin")] User user)

Все "правда" значения перезаписываются при вызове .SaveChanges (), что противоречит К. Скотту АлленуСообщение в блоге на тему:http://odetocode.com/blogs/scott/archive/2012/03/11/complete-guide-to-mass-assignment-in-asp-net-mvc.aspx

Похоже, единственной альтернативой является шквал выделенных моделей ViewModel, подключенных к Automapper. Хотя это безопасно, это похоже на ОГРОМНУЮ головную боль, особенно когда:

У вас могут быть разные требования к действиям Create, Edit, Index и Detail, требующие разных ViewModelsВам может потребоваться предоставить доступ к некоторым полям, доступным только для чтения (например, CreatedBy для действия Edit), которые не могут иметь атрибут [ReadOnly] для свойства, поскольку они обновляются действием Create.

Я знаю, что кто-то ответит, сказав, что вы должныникогда привязать модели данных к представлениям, но это поведение шаблона по умолчанию и способ его 'Показано почти во всей документации. И кроме того, MVC + EF должен был сделать жизньПолегченеСильнееи океан классов ModelView, связанных с AutoMapper, не то, что я считаю проще.

Так кто-нибудь знает, как заставить [Bind] функционировать так, как рекламируется?

Ответы на вопрос(2)

Ваш ответ на вопрос