MVC3不引人注目的验证不适用于自定义DataAnnotations属性

本文关键字:适用于 自定义 DataAnnotations 属性 不适用 验证 引人注目 MVC3 | 更新日期: 2023-09-27 18:04:46

我有一个自定义属性,它目前是DataAnnotations的简单包装器。RequiredAttribute(稍后我将扩展它,但现在只是试图得到这个概念的证明)。然而,这并不适用于MVC3不显眼的验证。

这是一个非常简单的问题,真的。

这是我的自定义属性:

[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;
    }
}

这里有两个模型属性,一个使用自定义属性,一个使用DataAnnotations属性:

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

以下是Razor代码:

<p>
    @Html.TextBoxFor(model => model.FirstName)
    @Html.ValidationMessageFor(model => model.FirstName)
</p>
<p>
    @Html.TextBoxFor(model => model.LastName)
    @Html.ValidationMessageFor(model => model.LastName)
</p>

结果如下:

<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>

所以你可以看到,FirstName(使用DataAnnotations)被渲染为验证器所需的必要的html属性,但LastName(使用CustomValidationAttributes)是缺少data-val-requireddata-val attributes

我做错了什么,或者这是不支持MVC3不显眼的验证?

MVC3不引人注目的验证不适用于自定义DataAnnotations属性

正如ingo在评论中指出的那样,我最终不得不实现IClientValidatable以使这些工作。因此,在上面的例子中,我必须将这个添加到我的属性中:

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