模型验证正则表达式从不匹配

时间:2012-08-02 13:47:14

标签: regex asp.net-mvc-3 razor

我有以下正则表达式注释:

    [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”时失败。所以正则表达式机制似乎有用..

1 个答案:

答案 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,始终为0match.Length == input.Length的评估始终为false

它适用于MembershipProvider,因为它只检查match.Success,而不关心匹配的长度。

我看到两种可能的解决方案:

  1. 重写你的正则表达式模式不使用分组结构(我不擅长正则表达式,所以我在这里无法帮助)
  2. 创建您自己的RegularExpressionAttriubte(或从内置版本中派生)IsValid方法中您只检查match.Success