MVC2: проверка ввода пользователя / лучшие практики - PullRequest
3 голосов
/ 10 марта 2010

Я пытаюсь проверить ввод пользователя, в частности пароли пользователей. У меня есть некоторые проверки JQuery, но, конечно, мне также нужно проверить на стороне сервера. Теперь мой запрос поступает к контроллеру, который передает его на UserService. Все свободно связано, поэтому контроллер действительно не знает слишком много о внутреннем UserService. Теперь предположим, что пользователь ввел слабый пароль, поэтому мне нужно сказать ему «эй, этого недостаточно».

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

Почему-то мне нужно позвонить

ModelState.AddModelError(field, exception);

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

ModelState.AddModelError(ex.Field, ex.Message);, где мне может понадобиться какое-то дополнительное отображение - что существенно для пути, взятого в NerdDinner, где у них есть RuleViolations.

Однако в NerdDinner бизнес-объект самопроверяется. В данном случае это не лучший способ, потому что «бизнес-объект» здесь - это просто хранилище для электронной почты и пароля, которое реализует IIdentity. Он не должен ничего знать о длинах паролей и должен использоваться в разных приложениях.

Более того, ArgumentException и ValidationException, похоже, тоже не подходят, потому что первое сделано для нарушений контракта, а второе должно использоваться DataAnnotations.

Все это, конечно, только верхушка айсберга, потому что вокруг так много скрывающихся тонкостей. Возможно, кто-то может указать мне правильное направление?

Ответы [ 2 ]

1 голос
/ 10 марта 2010

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

...
var result = userService.Validate(newUser);
if (!result.IsValid) {    
    result.Errors.ForEach( m => ModelState.AddModelError(m.field, m.message));
}
...

Как насчет этого?

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

Ответ на комментарий ниже:

Ну, вам нужно создать ValidationResult, что-то вроде.

public class ValidationResult
{
   public string Field {get;set;}
   public string Message {get;set;}
}

Так что, если я правильно читаю, ваш контроллер имеет UserService, UserService имеет Validator, а Validator проверяет пользователя.

Когда вы передаете эту проверку из вашего Validator в UserService в Controller, просто перехватите ее и используйте, а затем передайте.

Если вы не хотите выполнять роль своей собственной библиотеки проверки (и вы не должны) есть некоторые замечательные инструменты, такие как Enterprise Library и FluentValidation .Они могут отдельно определять вашу логику проверки вне ваших объектов, если вас это беспокоит.

1 голос
/ 10 марта 2010

Вы можете использовать xVal .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...