asp.net - DataAnnotion 在客户端失败(卡住)?

标签 asp.net asp.net-mvc regex data-annotations

我有 ASP.NET MVC 网页,我使用 DataAnnotation 在客户端验证表单。其中一个 View 类具有如下所示的属性:

[StringLength(100, MinimumLength = 3, ErrorMessage = "Länken måste vara mellan 3 och 100 tecken lång")]
[Display(Name = "Länk")]
[RegularExpression(@"^(http(s)?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?)?$", ErrorMessage="Länkgen är inte giltlig")]
        public string Url { get; set; }

在 View 中,我将此代码用于属性:
@Html.LabelFor(c => c.Url, true)
@Html.TextBoxFor(c => c.Url, new { @class = "tb1", @Style = "width:400px;" })
@Html.ValidationMessageFor(model => model.Url)

粘贴这样的 URL 时:

http://95rockfm.com/best-voicemail-giving-play-by-play-of-car-accident/



网页将锁定,我无法在网页上执行任何操作。但是,如果我将其粘贴到:

http://95rockfm.com/best-voicemail-giving-play-by-play-of-car-accident



它工作得很好。

这些 javascript 文件包含在网页底部:
<script type="text/javascript" src="/Scripts/jquery.qtip.min.js"></script>
<script src="/Scripts/jquery-1.7.1.min.js"></script>
<script src="/Scripts/jquery-ui-1.8.20.min.js"></script>
<script src="/Scripts/jquery.validate.min.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script>

在 IE 和 Chrome 中都存在完全相同的问题。然而,IE 会回来说一个脚本需要很长时间和一个按钮来停止脚本。但是当切换输入控件时,脚本将再次运行并查看网页。

我没有使用任何自定义的东西,为什么我会得到这个?

最佳答案

. in 正则表达式匹配任何字符(事实上,这个句点是匹配 URL 中域后的斜杠)。您需要对其进行转义或将其放入字符类中以匹配句点。像这样:

@"^(http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=])?)?$"

或者:
@"^(http(s)?://([\w-]+[.])+[\w-]+(/[\w- ./?%&=])?)?$"

如果您不这样做,并且该模式找不到匹配项,那么您就有了嵌套重复,可能的组合数量呈指数级增长。由于 nemesv 在评论中链接了您,这导致 catastrophic backtracking .但是,如果您在组内匹配文字句点,则整个组的每次重复都必须以句点结束,因此没有指数数量的组合。

要了解“组合的指数数量”是什么意思,我将链接到我以前的两个答案(实际上是今天的一个):
  • RegEx slow when not match
  • Comparing speed of non-matching regexp

  • 还有一件事,为什么您的模式失败(灾难性的回溯主要是匹配失败的问题):您只需要在第一个斜杠后添加一个字符。您可能希望允许任意长的路径和查询字符串,因此添加 +到那个字符类:
    @"^(http(s)?://([\w-]+[.])+[\w-]+(/[\w- ./?%&=]+)?)?$"
    

    然而,一般来说,为什么要重新发明轮子而不是仅仅 googling for established URL regex patterns .

    关于asp.net - DataAnnotion 在客户端失败(卡住)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18922016/

    相关文章:

    c# - MVC4 webapi 中的反序列化/模型绑定(bind)不适用于数组

    asp.net - 正在调试的 Web 服务器进程已被 Internet 信息服务 (IIS) 终止。如何解决?

    asp.net - 如何在 IISExpress 上使用带有 localhost 的子域?

    c# - ASP MVC C# : Is it possible to pass dynamic values into an attribute?

    python - Pandas 字符串提取所有匹配项

    java - 匹配不同卡片的正则表达式模式

    java - 向现有正则表达式添加几个特殊字符

    asp.net - Http.Post 将参数传递为 null

    c# - 使用嵌套的 div 而不是表或流来渲染 RadioButtonList

    asp.net-mvc - HTTP 错误 401.2 - 未授权工作应用程序池中的新站点