2013-08-23 67 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