2012-07-18 38 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更好。

如果有人看到任何问题,请让我知道。