我有一个自定义属性,它当前是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-required
和data-val attributes
。
我做错了什么,或MVC3不引人注目的验证不支持吗?
提前致谢。
答案 0 :(得分:4)
正如ingo在评论中指出的那样,我最终必须实施IClientValidatable
才能使这些工作正常。所以,在我上面的例子中,我不得不将它添加到我的属性中:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var modelClientValidationRule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.DisplayName),
ValidationType = "required"
};
yield return modelClientValidationRule;
}