我正在使用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
[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));
}
有没有人知道为什么这会通过单元测试,但是当我在浏览器中测试视图时却失败了?
答案 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)
此外,这是编写单元测试的正确方法:
[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));
}