我有以下正则表达式注释:
[RegularExpression(@"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})", ErrorMessage = "Password is not strong enough!")]
public string Password { get; set; }
这是我在我的MembershipProvider中使用的正则表达式的复制/粘贴,它可以在其中工作,因为我可以注册“admin1 *”之类的密码。我也在RegexHero中测试了这个正则表达式,它确实有效。
当我将表单发回给控制器时,该值也存在,但模型永远不会验证。
任何人都知道这可能是什么?
提前致谢,
编辑:
我使用Regex进行测试,该Regex验证仅包含5个数字的字符串,并且在输入12345时验证,并且在其他字符串如“abc”时失败。所以正则表达式机制似乎有用..
答案 0 :(得分:3)
您的正则表达式很好,问题在于IsValid
中如何实现RegularExpressionAttriubte
方法。因为输入只有在匹配整个模式时才有效。
Resharper看到的IsValid
方法的摘录:
public override bool IsValid(object value)
{
//...
Match match = this.Regex.Match(input);
if (match.Success && match.Index == 0)
return match.Length == input.Length;
else
return false;
}
您的模式@"(?=.{6,})(?=(.*\d){1,})(?=(.*\W){1,})
与输入admin1*
匹配,因此match.Success
将为true
,但由于使用了Grouping constructs match.Legth
,始终为0
,match.Length == input.Length
的评估始终为false
。
它适用于MembershipProvider
,因为它只检查match.Success
,而不关心匹配的长度。
我看到两种可能的解决方案:
RegularExpressionAttriubte
(或从内置版本中派生)IsValid
方法中您只检查match.Success