2015-11-26 4 views
4

Я использую FluentValidation для проверки моих моделей как на стороне клиента, так и на стороне сервера. Я на последней версии:Проверка электронной почты с помощью простой проверки не является тем же клиентом, что и serveride

FluentValidation.MVC5

на момент написания, что

5.5.0.0

У меня есть следующие валидатор, упрощенное:

public class MyViewModelValidator : AbstractValidator<MyViewModel> 
    { 
     public MyViewModelValidator() 
     { 
       RuleFor(x => x.Email) 
        .EmailAddress().WithLocalizedMessage(() => MyResources.Validation_Email_NotValidAddress) 
        .NotEmpty() 
        .WithLocalizedMessage(() => MyResources.Validation_Email); 
     } 
    } 

на стороне клиента, кажется, сделать некоторые основные проверки, например, он не будет ничего без текста обе стороны от символа «@» принять, однако он будет принимать что-то вроде [email protected]

Проблема возникает, когда я отправляю эти данные , у меня есть следующий в моем контроллере:

if (!ModelState.IsValid) 
     throw new Exception("Model validation error"); 

Это видит модель недействительной вследствие [email protected] адреса электронной почты и выдает сообщение об ошибке. Так что, похоже, моя проверка на лицевой стороне более слабая, чем моя проверка на стороне сервера.

Относясь к документации, он указывает, что метод Email() поддерживается клиентами, однако, как представляется, существует некоторая разница между этой серверной стороной и тем, что отображается передним концом.

https://fluentvalidation.codeplex.com/wikipage?title=mvc

Как я могу обеспечить проверку на стороне клиента, как тщательно, как на стороне сервера с электронной почтой.

ответ

0

Как Евгений затрагивали выше, я в конце концов решил использовать Matches правило, так как это один из валидаторов который поддерживается клиентом.

RuleFor(x => x.Email) 
       .Matches(@"^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$").WithLocalizedMessage(() => MyResources.Validation_Email_NotValidAddress)    
       .NotEmpty() // <-- and cant be empty 
       .WithLocalizedMessage(() => MyResources.Validation_Email); 

Вышеупомянутое Regex, я считаю, используется ASP.NET для RegularExpressionValidator. И хорошо работает для моего требования.

1

сторона клиента правила для ввода электронной почты (украшенного атрибутом данных валина-почты), определенного в jquery.validate plugin core (поиск по странице с помощью слова «электронной почты», и вы найдете RegExp)

стороны сервера правила для свойства электронной почты, определенного в Fluent Validation EmailValidator class (также RegExp)

С точки зрения жизненного цикла эти проекты не имеют ничего общего: в любом выпуске новой версии внутреннее регулярное выражение может стать более/менее строгим в обоих проектах одновременно, и если ваша цель - иметь такое же правило на клиенте и сервере и заставить его работать правильно, независимо от плу Обновления версии gin/library - моя рекомендация - заменить действующее правило EmailAddress() правилом Match() и указать regexp, который явно удовлетворяет потребностям модели домена.

UPDATE:

Выбор правильного регулярному_выражению другая тема, которая широко описана here