2013-08-23 153 views
0

我有一个视图模型用于改变密码,它使用Compare DataAnnotation像这样:比较属性不使用显示属性相比,财产

[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属性?

回答

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 对不起,忘了补充所需的客户端验证,这是解释here多余的部分。您可以在您的的Global.asax.cs文件补充一点:

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

或执行上的自定义属性IClientValidatable接口。这两个都显示在链接

+0

幸运的是,这是行得通的。不幸的是,它不会达到我的目的,因为创建新属性将删除jQuery客户端验证,并且仅在回发时进行验证。我会将此标记为答案,但是我不会在我的项目中使用它。不管怎么说,多谢拉! – Kehlan

+0

对不起,我更新了答案,你需要做的额外工作:) –

+0

CompareAttributeAdapter类似乎是System.Web.Mvc组件的内部,你怎么能够使用它? – Konamiman