1

我有一个用于更改密码的 ViewModel,它使用CompareDataAnnotation,如下所示:

[Display(Name = "New Password")]
public string New { get; set; }

[Compare("New")]
[Display(Name = "Confirm Password")]
public string ConfirmPassword { get; set; }

不幸的是,该Compare属性没有利用Display比较属性的属性。

错误消息显示为

'Confirm Password' and 'New' do not match.

您可以看到使用比较属性的Display属性,而不是比较属性的属性。

我还将指定我不想使用该ErrorMessage参数,因为这样我将硬编码属性名称,而不是简单地从现有属性中获取它。我想尽可能地保持这个解决方案的最佳实践。

如何使Compare属性Display利用比较属性的属性?

4

2 回答 2

2

我认为这可能是 Compare 属性的一些问题,因为您可以在其属性列表中看到 OtherDisplayName 属性,并且它正确使用了它正在装饰的属性的显示名称(“确认密码”而不是“确认密码”) .

我发现的一种解决方法是简单地创建一个继承自 CompareAttribute 的新类,如下所示:

public class CompareWithDisplayName : CompareAttribute
{
    public CompareWithDisplayName(string otherProperty) : base(otherProperty)
    {
    }
}

然后在您的财产上使用它:

[Display(Name = "New Password")]
public string New { get; set; }


[Display(Name = "Confirm Password")]
[CompareWithDisplayName("New")]
public string ConfirmPassword { get; set; }

老实说,我不知道为什么会这样。这可能与反射有关,也可能与它计算出每个属性的显示属性的顺序有关。通过创建它的自定义版本,也许顺序会改变?不管怎样,这对我有用:)

编辑 2 抱歉,忘记添加客户端验证所需的额外部分,此处对此进行了说明。您可以将其添加到Global.asax.cs文件中:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(CompareWithDisplayName), typeof(CompareAttributeAdapter))

或在自定义属性上实现 IClientValidatable 接口。这两个都显示在链接中

于 2013-08-24T10:00:12.790 回答
2

也许为时已晚,但我在 Asp.Net Core Razor Page Web App 中遇到了同样的问题,简单的解决方法是使用 Password 和 ConfirmPassword 属性创建一个新的 InputModel 类。然后,将表单输入绑定到 InputModel 属性。

像这样:

    [BindProperty]
    public InputModel UserPassword { get; set; }

    public class InputModel {
      [BindProperty]
      [Display(Name = "Contraseña")]
      [Required(ErrorMessage = "La contraseña es obligatoria.")]
      [RegularExpression("^[a-zA-ZñÑ0-9]+$",ErrorMessage = "Sólo se permiten letras y números.")]
      [StringLength(12,ErrorMessage = "La contraseña no debe tener más de 12 caracteres.")]
      [MaxLength(12,ErrorMessage = "La contraseña no debe tener más de 12 caracteres.")]
      [MinLength(2,ErrorMessage = "La contraseña no debe tener menos de 2 caracteres.")]
      public string Password { get; set; }

      [BindProperty]
      [Display(Name = "Confirmación de Contraseña")]
      [Required(ErrorMessage = "La contraseña es obligatoria.")]
      [Compare(nameof(Password),ErrorMessage = "La contraseña de confirmación no coincide.")]
      public string ConfirmPassword { get; set; }
    }
于 2019-07-25T02:23:16.363 回答