Проверка на стороне клиента аннотаций данных ASP.NET MVC с унаследованным атрибутом RegularExpressionAttribute - PullRequest
20 голосов
/ 02 сентября 2010

Для поддержания чистоты проверки моей модели я хотел бы реализовать свои собственные атрибуты проверки, например PhoneNumberAttribute и EmailAttribute Некоторые из них могут быть реализованы в виде простых классов, которые наследуются от RegularExpressionAttribute.

Однако я заметил, что это нарушает проверку этих атрибутов на стороне клиента. Я предполагаю, что есть какая-то привязка типа, которая где-то не срабатывает.

Любые идеи, что я могу сделать, чтобы проверка на стороне клиента работала?

Пример кода :

public sealed class MailAddressAttribute : RegularExpressionAttribute
{
    public MailAddressAttribute()
        : base(@"^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$")
    {
    }
}

Ответы [ 2 ]

29 голосов
/ 03 сентября 2010

Вам потребуется зарегистрировать адаптер проверки на стороне клиента для своего пользовательского атрибута. В этом случае вы можете использовать существующий RegularExpressionAttributeAdapter в System.Web.Mvc, поскольку он должен работать точно так же, как стандартный атрибут регулярного выражения. Затем зарегистрируйте его, когда ваше приложение начнет использовать:

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

Если вы напишите атрибут, который требует пользовательской проверки на стороне клиента, вы можете реализовать свой собственный адаптер, унаследовав от DataAnnotationsModelValidator (см. Также Блог Фила Хаака ).

9 голосов
/ 05 апреля 2012

расширение правильного ответа

public class EmailAttribute : RegularExpressionAttribute
{
    static EmailAttribute()
    {
        DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter));
    }

    public EmailAttribute()
        : base(@"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$") //^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$
    {

    }
}
...