Как сделать так, чтобы пользовательский атрибут ValidationAttribute отображался как атрибут data-val-xx на стороне клиента?

Учитывая 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?

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


person Jonathan    schedule 08.11.2010    source источник


Ответы (1)


Ну, 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. :)

person Jonathan    schedule 08.11.2010