ASP.NET MVC 2客户端验证错误地触发

时间:2010-11-30 21:22:50

标签: c# regex asp.net-mvc-2 data-annotations validation

我正在使用DataAnnotations在ASP.NET MVC 2项目中启用客户端验证。我遇到了一个问题,我的URL验证正则表达式通过了我的单元测试,但它在实际网站中失败了。

模型

[RegularExpression(UrlValidation.Regex, ErrorMessage = UrlValidation.Message)]
public string Url { get; set; }

Regex = "(([\w]+:)?//)?(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,4}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?"

消息=“无效的网址”

视图

<div class="editor-label">
    <%: Html.LabelFor(model => model.Url) %>
</div>
<div class="editor-field">
    <%: Html.TextBoxFor(model => model.Url) %>
    <%: Html.ValidationMessageFor(model => model.Url) %>
</div>

结果使用网址= http://www.chicagoshakes.com/main.taf?p=7,8

alt text

通过单元测试

[Test]
public void GetVarUrlPasses()
{
    var url = "http://www.chicagoshakes.com/main.taf?p=7,8";
    var regex = new Regex(UrlValidation.Regex);
    Assert.IsTrue(regex.IsMatch(url));
}

有没有人知道为什么这会通过单元测试,但是当我在浏览器中测试视图时却失败了?

3 个答案:

答案 0 :(得分:1)

我可以看到该正则表达式的几个问题,但是绊倒你的可能是p=7,8中的逗号。你的正则表达式与它不匹配,但IsMatch并不要求它;在7停下来真是太开心了。我猜想客户端验证器隐含地锚定了匹配。无论如何应该锚定正则表达式;在开头添加^,在结尾添加$,至少应该获得一致的结果。然后,您可以更改正则表达式以容纳逗号。

正则表达式中还有一个拼写错误:f中的第二个[a-fA-f\d]应为F。而且,虽然在同一组方括号中\d\w不是错误,但它是多余的; \w会匹配数字和字母,因此您可以删除\d(并[\w\d]可以缩减为\w)。最后,{2,2}应该只是{2}

答案 1 :(得分:0)

因为它通过了单元测试,问题可能出在您的控制器或模型中。 Url是否曾被直接访问过?

答案 2 :(得分:0)

艾伦摩尔基本上是正确的,正则表达式是垃圾。我最终使用this regex

此外,这是编写单元测试的正确方法:

[Test]
public void GetVarUrlPasses()
{
    var url = "http://www.chicagoshakes.com/main.taf?p=7,8";
    var attribute = new RegularExpressionAttribute(regex);
    Assert.IsTrue(regex.IsValid(url));
}
相关问题