C# MVC3非侵入性验证不适用于自定义DataAnnotations属性
我有一个自定义属性,它目前是DataAnnotations.RequiredAttribute的一个简单包装器(稍后我将对其进行扩展,但现在只是尝试让这个概念验证工作起来)。然而,这并不适用于MVC3不引人注目的验证 这是一个非常简单的问题,真的 以下是我的自定义属性:C# MVC3非侵入性验证不适用于自定义DataAnnotations属性,c#,asp.net-mvc,asp.net-mvc-3,data-annotations,unobtrusive-validation,C#,Asp.net Mvc,Asp.net Mvc 3,Data Annotations,Unobtrusive Validation,我有一个自定义属性,它目前是DataAnnotations.RequiredAttribute的一个简单包装器(稍后我将对其进行扩展,但现在只是尝试让这个概念验证工作起来)。然而,这并不适用于MVC3不引人注目的验证 这是一个非常简单的问题,真的 以下是我的自定义属性: [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)] public class RequiredA
[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;
}
}
[System.ComponentModel.DataAnnotations.Required]
public string FirstName { get; set; }
[CustomValidationAttributes.Required]
public string LastName { get; set; }
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var modelClientValidationRule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.DisplayName),
ValidationType = "required"
};
yield return modelClientValidationRule;
}
以下是两个模型属性,一个使用自定义属性,一个使用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;
}
}
[System.ComponentModel.DataAnnotations.Required]
public string FirstName { get; set; }
[CustomValidationAttributes.Required]
public string LastName { get; set; }
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var modelClientValidationRule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.DisplayName),
ValidationType = "required"
};
yield return modelClientValidationRule;
}
以下是剃须刀代码:
<p>
@Html.TextBoxFor(model => model.FirstName)
@Html.ValidationMessageFor(model => model.FirstName)
</p>
<p>
@Html.TextBoxFor(model => model.LastName)
@Html.ValidationMessageFor(model => model.LastName)
</p>
@Html.TextBoxFor(model=>model.FirstName)
@Html.ValidationMessageFor(model=>model.FirstName)
@Html.TextBoxFor(model=>model.LastName)
@Html.ValidationMessageFor(model=>model.LastName)
以下是结果输出:
<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>
正如ingo在上面的评论中指出的那样,我最终不得不实现iclientvalidable
,以使它们能够工作。因此,在上面的示例中,我必须将其添加到属性中:
[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;
}
}
[System.ComponentModel.DataAnnotations.Required]
public string FirstName { get; set; }
[CustomValidationAttributes.Required]
public string LastName { get; set; }
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var modelClientValidationRule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.DisplayName),
ValidationType = "required"
};
yield return modelClientValidationRule;
}
public IEnumerable GetClientValidationRules(ModelMetadata元数据,ControllerContext上下文)
{
var modelClientValidationRule=新modelClientValidationRule
{
ErrorMessage=FormatErrorMessage(metadata.DisplayName),
ValidationType=“必需”
};
收益返回模型ClientValidationRule;
}
你可以在这里@ingo找到你的解决方案——不过我很困惑。如果我没有扩展基本验证,为什么我必须通过实现IsValid
和GetClientValidationRules
来“重新发明轮子”,如果这些实现已经存在并且适用于基本验证属性(RequiredAttribute
)?我刚刚写了一篇关于创建自定义ValidationAttribute以及如何将其转换为不引人注目的验证的博客。该示例处于启用状态,并使用我编写的属性,该属性要求string属性包含指定的单词或短语。您还可以使用requiredattributedapter
@JimSchubert注册您的自定义RequiredAttribute
。您可以链接到博客帖子吗?@AnnL。文章链接在github页面的摘要中。在这里,以防万一: