MVC3不显眼的验证不工作的自定义DataAnnotations属性

问题描述:

我有一个自定义属性,目前是DataAnnotations.RequiredAttribute(我会稍后扩展它,但只是试图让这个概念证明现在工作)的简单包装。但是,这不适用于MVC3不显眼的验证。MVC3不显眼的验证不工作的自定义DataAnnotations属性

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

这里是我的自定义属性:

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

因此,大家可以看到,名字(使用DataAnnotations)呈现与所需验证必要的HTML属性,但姓氏(使用CustomValidationAttributes)缺少data-val-requireddata-val attributes

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

在此先感谢。

+1

你可以在这里找到http://*.com/questions/6495510/mvc-2-vs-mvc-3-您的解决方案custom-validation-attributes-using-dataannotationsmodelvalidatorpr – ingo

+0

@ingo - 虽然我很困惑。如果我没有扩展基础验证,为什么我必须通过实现'IsValid'和'GetClientValidationRules'来“重新发明*”,如果这些实现已经存在并且适用于基本验证属性(在这种情况下为'RequiredAttribute')? –

正如ingo在评论中指出的那样,我最终不得不实施IClientValidatable才能使这些工作成功。所以,在我上面的例子中,我不得不把它添加到我的属性:

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

     yield return modelClientValidationRule; 
    } 
+2

我刚刚写了一篇关于创建自定义ValidationAttribute的博客,以及如何将其转换为不显眼的验证。该示例位于[github](https://github.com/jimschubert/ContainsAttributeExample)上,并与我制作的属性一起使用,这将需要您的字符串属性包含指定的单词或短语。你也可以使用'RequiredAttributeAdapter'注册你自定义的'RequiredAttribute' [见这里](https://github.com/jimschubert/ContainsAttributeExample/blob/master/ContainsUnobtrusiveExample/Global.asax.cs#L39) –

+0

@JimSchubert你能链接到博客文章? –

+0

@AnnL。该帖子在github页面的摘要中链接。这是,以防万一:http://www.ipreferjim.com/?p=606 –