2

我有一个自定义属性,它目前是 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; }

这是剃刀代码:

<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-requiredand data-val attributes

我做错了什么,还是 MVC3 不显眼的验证不支持这一点?

提前致谢。

4

1 回答 1

4

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

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

        yield return modelClientValidationRule;
    }
于 2011-08-09T15:00:28.010 回答