Подтвердить что ты не робот

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

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

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

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

Пример кода:

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

Ответ 1

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

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

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

Ответ 2

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

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

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

    }
}