如何创建具有客户端验证的自定义比较属性
本文关键字:验证 客户端 自定义 属性 比较 何创建 创建 | 更新日期: 2023-09-27 18:29:08
标题说明了一切,但我将在这里添加一些背景。
直到最近,我一直在使用MVC已经编写的CompareAttribute
来比较两个值,在本例中是密码及其确认。它运行得很好,只是该属性不显示由正在比较的属性的[Display(Name = "Name")]
属性设置的显示名称。
以下是正在比较的两种特性:
[Required]
[Display(Name = "New Password")]
public string New { get; set; }
[Compare("New")]
[Display(Name = "Confirm Password")]
public string ConfirmPassword { get; set; }
验证消息如下所示:
'Confirm Password' and 'New' do not match.
这是有效的,但显然没有达到应有的效果。New
应该读作New Password
,由Display
属性指定。
我已经完成了这项工作,尽管还不完全。以下实现(出于某种原因)解决了无法获得指定属性名称的问题,但我不确定原因:
public class CompareWithDisplayNameAttribute : CompareAttribute
{
public CompareWithDisplayNameAttribute(string otherProperty)
: base(otherProperty)
{
}
}
现在,即使这样做有效,客户端验证也不起作用。我收到了另一个问题的答案,建议使用类似的东西
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CompareWithDisplayName), typeof(CompareAttributeAdapter))
在我的Global.asax
中,然而CompareAttributeAdapter
实际上并不存在。
所以我来了。我的自定义CompareWithDisplayName
属性正确使用了Display
属性,但客户端验证完全缺失。
如何以最干净的方式使用此解决方案进行客户端验证?
如果希望自定义比较属性与客户端验证一起使用,则需要实现IClientValidatable
。它有GetValidationRules
,您可以在这里进行任何自定义验证。
示例
public class CompareWithDisplayNameAttribute : CompareAttribute, IClientValidatable
{
public CompareWithDisplayNameAttribute(string otherProperty)
: base(otherProperty)
{
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata, ControllerContext context)
{
// Custom validation goes here.
yield return new ModelClientValidationRule();
}
}