Проверка аннотаций данных ASP.NET MVC на стороне клиента с унаследованным атрибутом RegularExpressionAttribute

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

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

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

Пример кода:

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

person zidar    schedule 02.09.2010    source источник
comment
Но это RegularExpressionAttribute, и у него есть регулярное выражение, которое отлично работает, если оно явно определено в модели.   -  person zidar    schedule 02.09.2010
comment
Собственно то, что я хотел спросить   -  person TWith2Sugars    schedule 28.09.2010
comment
Возможный дубликат Custom DataAnnotations Validator, производный от RegularExpressionAttribute   -  person KyleMit    schedule 11.04.2019


Ответы (2)


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

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

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

person cjberg    schedule 03.09.2010
comment
Как зарегистрировать адаптер из того места, где я определил атрибут. Эта реализация требует знания атрибутов. Я не могу передать DLL другому разработчику и попросить использовать атрибуты, я также должен попросить его добавить код в его файл asax. Есть ли более менее связанный способ? - person Cherven; 05.04.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-.]+$
    {

    }
}
person Cherven    schedule 05.04.2012
comment
По какой-то причине, несмотря на вызов статического конструктора, он не создавал разметку проверки на стороне клиента. Поэтому я добавил регистрацию в Application_Start(), в Global.asax. - person Eric Lease; 15.12.2017