Как получить пользовательский атрибут ValidationAttribute, отображаемый как атрибут «data-val-xx» на стороне клиента? - PullRequest
7 голосов
/ 08 ноября 2010

Учитывая ViewModel, которая выглядит следующим образом:

public class Login {
    [Required]
    public string Username { get; set; }

    [Required, CustomValidator]
    public string Password { get; set; }
}

И представление как это (синтаксис Razor здесь):

@Html.TextBoxFor(f => f.Password)

Я получаю следующую разметку:

<input type="text"
       value="" 
       data-val-required="This field is required." />

Однако я хотел бы также включить атрибут 'data-' для моего пользовательского валидатора.

Я хочу что-то вроде этого:

<input type="text" 
       value="" 
       data-val-required="This field is required."
       data-val-customvalidator="XYZ" />

Как я могу добиться этого с ASP.NET MVC 3.0?

Например, нужно ли добавить какой-то специальный атрибут в мой пользовательский валидатор?Или зарегистрировать это где-нибудь?

1 Ответ

8 голосов
/ 08 ноября 2010

Ну, MSDN спас меня (как это часто бывает).

http://msdn.microsoft.com/en-us/library/ff398048.aspx

Итак, сначала я должен создать адаптер для моего атрибута проверки:

public class CustomAttributeAdapter : DataAnnotationsModelValidator<EmailAttribute>
{
    public CustomAttributeAdapter(
        ModelMetadata metadata,
        ControllerContext context,
        CustomAttribute attribute) :
        base(metadata, context, attribute)
    {
    }

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        ModelClientValidationRule rule = new ModelClientValidationRule()
        {
            ErrorMessage = ErrorMessage,
            ValidationType = "custom"
        };
        return new ModelClientValidationRule[] { rule };
    }
}

(Параметр «ValidationType» должен быть строчным, чтобы это работало, поскольку это пост-исправление, которое будет использоваться в качестве атрибута HTML5 - «data-val-custom».)

Тогда все, что мне нужно сделать, это зарегистрировать его в Application_Start.

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

С нетерпением жду веселья с проверкой HTML5. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...