Атрибут [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] функционировать так, как рекламируется?