Как стать автором
Обновить

Комментарии 11

Вот пришел тебе ViewModel с Name = null. Ну так тебе все равно придется в контроллере придется проверять, какая роль тебе прислала эту ViewModel, чтоб ненароком не перезаписать в базу null вместо Name. В чем тогда смысл этого примера?
Не придется. TryUpdateModel не сохраняет в модели значения свойств по умолчанию. Кроме того проверка допустимых значений, это задача валидации и должна производиться в любом случае вне зависимости от роли пользователя.
В чем тогда смысл Вашего комментария?
TryUpdateDB — метод, допустим, который обновляет данные через ORM в БД. Атрибут Name, равный null тоже в БД запишется? Т.е. мы устанавливаем значение атрибута Name в колонке в NULL.

ИМХО без if else трудно обойтись.
В хорошем интерфейсе у пользователя и не должно быть возможности ввести данные в то поле которое потом не сохранится, тем более без логики обработки нула мы получим лажу при сохранении в итоге.
Ввести данные можно и без интерфейса просто сформировав POST из js. TryUpdateModel не сохраняет в модели значения свойств по умолчанию. Для демонстрации подхода пример вполне коректен.
Действительно, зачем выводить поле Название как редактируемое в случае отсутствия прав, лучше было вывести его только для чтения, как Индекс. А еще мне кажется лучше идти по принципу предоставления доступа, чем запрещения. Т.е. прописывать — кому можно редактировать, чем кому нельзя. Но для демонстрации некоторых аспектов работы с моделями статья вполне подходит.
Я бы в биндере не делал таких фокусов. Не его это дело. Если так хочется декларативного подхода, то как вариант, можно в время маппинга в доменную модель в каком-нибудь объекте типа Mapper прогонять через набор политик, скармливая им модель для проверки и валидации. Тогда можно и динамически расширять политики, и не зависеть от слоя представления, так как если у вас добавится WCF сервис, то придется и там свой стек валидации вкручивать, что имхо некорректно.
Микрософт в MVC определил атрибут [Bind] для проделывания таких фокусов. Подробнее можно посмотреть например здесь www.dotnetcurry.com/ShowArticle.aspx?ID=439.
Это конечно не означает, что это единствееный способ защиты. Ваш подход вполне разумен, для многих сценариев.
Согласен, что для простых случаев есть Bind. Ваш пример насторожил проверкой авторизации на выполнение действия в биндере. Биндером вы можете просто фильтровать OneWay свойства. Просто в свете выхода 4.5 с интегрированным WIF, ваш код может перерасти из банальной проверки вхождения в роль в очень некрасивый кусок кода, который несет в себе определенные риски связанные с безопасностью. Логичнее делать проверки такого рода в чуточку дальше в коде, где понятно что эта операция должны выполняться при определенных условиях. Это сугубо ИМХО.
Мне кажется, или это решение очевидное в силу того что это ASP.NET MVC? Вроде же как в конвейере можно переопределить практически любую часть. (Я к тому что такое решение самое «природное»)
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории