Проверка MVC3 на основе роли пользователя - PullRequest
2 голосов
/ 27 мая 2011

Мы используем MVC3 с проверкой unobstructuve , все в порядке;наши пользовательские проверки работают как на сервере, так и на клиенте.

Мы также используем встроенный asp.net Ролевый провайдер .У нас есть особые виды, которые мы используем для разных ролей.Некоторые поля (свойства ViewModel) являются обязательными в зависимости от роли вошедшего в систему пользователя.

У меня вопрос: как создать ValidationAttribute на основе роли?Мы хотим сделать свойство Обязательным, когда пользователь является обычным пользователем;но мы не хотим делать это поле обязательным, если пользователь является администратором.Но мы хотим использовать то же представление.

Я знаю, что мы можем создать пользовательский ValidationAttribute (создание класса, производного от ValidationAttribute ) Полагаю, это будет работатьхорошо для проверки на стороне сервера.Но мы действительно хотим проверить эту клиентскую сторону.

Я считаю, что мы реализуем IClientValidatable в нашем выше ValidationAttribute и пишем некоторый jQuery, чтобы сделать Ajax-вызов обратно на сервер для проверки текущего вошедшего в систему пользователя ироли.Но это заставит нас делать вызов Ajax каждый раз, когда изменяется конкретное свойство, и зарегистрированный пользователь не изменится.

Как правильно это сделать?Или мы должны создать разные ViewModels для разных вошедших в систему пользователей?

Пожалуйста, дайте мне знать, когда приведенное выше объяснение не имеет смысла, я могу добавить пример кода при необходимости.

Любая помощь приветствуется.

Спасибо,

Пим

1 Ответ

0 голосов
/ 27 мая 2011

Я думаю, что вы действительно можете реализовать собственный атрибут ValidationAttribute, который также реализует IClientValidatable. Но тогда вы можете просто «повторно» использовать ненавязчивую требуемую проверку для клиентской стороны:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
        {
            if ( <your condition, e.g. if user has a certain role> )
                yield return new ModelClientValidationRequiredRule(<error message>);
        }

Это должно сгенерировать те же самые ненавязчивые обязательные атрибуты на входе, что и RequiredAttribute, но только если ваше условие выполнено.

...