2012-07-18 21 views
0

首先,我是相當新的MVC,但有一個現有的項目在MVC3和四處尋找MVC4,所以這兩個版本的答案讚賞。MVC非常量的屬性參數與會員資格屬性同步

在我的MVC視圖我有這樣一行:

Passwords must be at least @Membership.MinRequiredPasswordLength characters long. 

,並在型號我有這樣的:

[Required] 
[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)] 
[DataType(DataType.Password)] 
[Display(Name = "Password")] 
public string Password { get; set; } 

(對於MVC模板項目產生這些都是自動)

我的web.config MembershipProvider具有此屬性:

minRequiredPasswordLength="8" 

這樣做的問題是,用戶將被告知最小長度爲8,但實際驗證將爲6. 當然,我可以將兩者設置爲相同的值,但我想知道是否有簡單的方法只能使用其中的一個或同時使用兩者。

我已經試過這樣:

[StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = Membership.MinRequiredPasswordLength)] 

,但得到的錯誤「的屬性參數必須是常量表達式,......」

我知道寫自定義驗證屬性的選項但我想避免這一點,因爲我基本上會寫驗證邏輯,已經存在(除了值的來源)

或者,我可以顯示模型的最小亮度在視圖中是什麼?

我怎樣才能只有一個地方做出改變?

回答

2

我不確定是否有更直接的方法(因爲它必須是一個常數值),但是you could write your own CustomValidationAttribute並檢查那裏的web.config值。

+0

是的,我確實遇到過這個選項,但是我會編寫自定義驗證器來實現已經存在的相同驗證邏輯(值的來源除外)。如果可能的話,我寧願避免這種情況,但是謝謝你的建議。 – PostureOfLearning 2012-07-19 00:46:45

+0

你的答案可能不是我所希望的,但它似乎是我需要做的,所以我將它標記爲答案。我會給你評分上的+1,但我還沒有要求15分。 – PostureOfLearning 2012-07-23 23:22:23

+0

我得到了足夠的積分給你+1 ...;)謝謝 – PostureOfLearning 2012-08-01 23:16:38

0

我不知道這是否是一個好辦法,但這裏是我做過什麼......

將這個成MembershipHelper.cs:

namespace System.Web.Security 
{ 
    public static class MembershipHelper 
    { 
     public const int MinRequiredPasswordLength = 6;// Membership.MinRequiredPasswordLength is defined in Web.Config 
     public const int MaxRequiredPasswordLength = 30; 
    } 
} 

然後在視圖中,你可以這樣做:

<p> 
    Passwords must be at least @MembershipHelper.MinRequiredPasswordLength characters long. 
</p> 

在模型中,你可以這樣做:

[Required(ErrorMessage = "Field is required.")] 
[StringLength(MembershipHelper.MaxRequiredPasswordLength, ErrorMessage = "Must be between {2} and {1} characters long.", MinimumLength = MembershipHelper.MinRequiredPasswordLength)] 
[DataType(DataType.Password)] 
[Display(Name = "Password")] 
public string Password { get; set; } 

我仍然不得不在兩個地方改變它,但是這比3更好。

如果有人看到任何問題,請讓我知道。