开发者

MVC3 Unobtrusive Validation not working for custom DataAnnotations attribute

I have a custom attribute that is currently a simple wrapper of the DataAnnotations.RequiredAttribute (I will extend it later, but just trying to get this proof of concept working for now). However, this isn't working with MVC3 unobtrusive validation.

It's a very simple problem, really.

Here is my custom attribute:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class RequiredAttribute : System.ComponentModel.DataAnnotations.RequiredAttribute
{
    public RequiredAttribute()
    {
    }

    public RequiredAttribute(Type errorMessageResourceType, string errorMessageResourceName)
    {
        this.ErrorMessageResourceName = errorMessageResourceName;
        this.ErrorMessageResourceType = errorMessageResourceType;
    }
}

Here are two model properties, one using the custom attribute, one using the DataAnnotations attribute:

[System.ComponentModel.DataAnnotations.Required]
public string FirstName { get; set; }

[CustomValidationAttributes.Required]
public string LastName { get; set; }

Here is the Razor code:

<p>
    @Html.TextBoxFor(model => model.FirstName)
    @H开发者_如何学Ctml.ValidationMessageFor(model => model.FirstName)
</p>
<p>
    @Html.TextBoxFor(model => model.LastName)
    @Html.ValidationMessageFor(model => model.LastName)
</p>

And here is the resulting output:

<p>
    <input type="text" value="" name="FirstName id="FirstName" data-val-required="The First Name field is required." data-val="true">
    <span data-valmsg-replace="true" data-valmsg-for="FirstName" class="field-validation-valid"></span>
</p>
<p>
    <input type="text" value="" name="LastName" id="LastName">
    <span data-valmsg-replace="true" data-valmsg-for="LastName" class="field-validation-valid"></span>
</p>

So as you can see, FirstName (using DataAnnotations) is rendered with the necessary html attributes needed for the validators, but LastName (using CustomValidationAttributes) is missing the data-val-required and data-val attributes.

Am I doing something wrong, or is this not supported with MVC3 unobtrusive validation?

Thanks in advance.


As ingo pointed out above in the comments, I ended up having to implement IClientValidatable in order for these to work. So, in my example above, I had to add this to my attribute:

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var modelClientValidationRule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.DisplayName),
            ValidationType = "required"
        };

        yield return modelClientValidationRule;
    }
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜