如何创建具有客户端验证的自定义比较属性

本文关键字:验证 客户端 自定义 属性 比较 何创建 创建 | 更新日期: 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();
    }
}