пользовательский атрибут проверки не работает на клиенте, просто на сервере - PullRequest
4 голосов
/ 11 мая 2011

Я пытаюсь реализовать проверку пользовательских атрибутов, аналогичную той, что продемонстрирована здесь в блоге ScottGu: http://weblogs.asp.net/scottgu/archive/2010/01/15/asp-net-mvc-2-model-validation.aspx

У меня есть этот пользовательский атрибут валидатора для электронной почты:

public class EmailAttribute : RegularExpressionAttribute
      {
      public EmailAttribute() :
                base("^[A-Za-z0-9](([_\\.\\-]?[a-zA-Z0-9]+)*)@([A-Za-z0-9]+)(([\\.\\-]?[a-zA-Z0-9]+)*)\\.([A-Za-z]{2,})$") { }
      }

Мой класс использует это так:

    [Required(ErrorMessage = ValidationCiM.MsgObaveznoPolje)]
    [Email(ErrorMessage = ValidationCiM.MsgMailNeispravan)]
    [StringLength(ValidationCiM.LenSrednjePolje, ErrorMessage = ValidationCiM.MsgSrednjePolje)]
    public string Mail { get; set; }

и все это хорошо работает на стороне сервера, модель подтверждена нормально, и все. Но проверка на стороне клиента не активирует для этого второй атрибут, он работает для Required, и он также работает для StringLength, но не для Email. я попытался включить jquery и ajax-скрипты Microsoft, но, похоже, нет никакой разницы.

В блоге ScottGu он заявляет, что пользовательская проверка, если она реализована подобным образом, должна работать без необходимости добавления пользовательского сценария.

Есть идеи, пожалуйста?

Ответы [ 2 ]

6 голосов
/ 11 мая 2011

Использовать IClientValidatable в ASP.NET MVC 3:

 public class EmailAttribute : RegularExpressionAttribute, IClientValidatable
{
    public EmailAttribute()
      :base(@"^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})$")
    {

    }

    public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
      var rule = new ModelClientValidationRegexRule(this.ErrorMessageString, base.Pattern);
      return new[] { rule };
    }
  }
3 голосов
/ 02 июня 2011

Что вам действительно нужно было сделать, это (при запуске приложения):

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter));

Он подключает проверку клиента к вашему пользовательскому атрибуту.

...