2013-09-20 2 views
5

У меня есть веб-страница ASP.NET MVC, где я использую DataAnnotation для проверки форм на стороне клиента. Один из классов представления имеют свойство, которое выглядит следующим образом:DataAnnotaion не удается (заморозить) на клиенте?

[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; } 

В представлении я использую этот код для СВОЙСТВ:

@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/

Веб-страница будет зависнуть, и я не могу сделать что-нибудь на wepage. Если я однако вставить это:

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> 

Точно такая же проблема accures как в IE и Chrome. Однако IE вернется и скажет, что сценарий занял много времени и кнопка, чтобы остановить скрипт. Но при переключении управления вводом сценарий снова запускается и просматривает веб-страницу.

Я не использую какие-либо пользовательские материалы, так почему я могу это получить?

+3

Этот феномен называется [Катастрофическое обратное слежение] (http://www.regular-expressions.info/catastrophic.html). Я не могу исправить ваше регулярное выражение (я не очень хорошо с ними), чтобы избежать этой ошибки, но есть много похожих вопросов на SO: http://stackoverflow.com/questions/14723667/javascript-hang-when-matching-regular -expression-using-ie-chrome http://stackoverflow.com/questions/17116675/why-does-this-regex-make-chrome-hang http://stackoverflow.com/questions/2407870/javascript-regex-hangs -using-v8 Другая статья: http://davetayls.me/blog/2012/10/11/its-a-regexp-catastrophe/ – nemesv

ответ

5

. в регулярных выражениях соответствует любому символу (и, фактически, этот период соответствует совпадению после домена в ваших URL-адресах). Вам нужно сбежать от него или поместить его в класс символов, чтобы соответствовать периоду. Как так:

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

или так:

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

Если вы не сделаете этого, и картина не может найти соответствие, то есть вложенная повторение, с экспоненциальным количеством возможных комбинаций. Поскольку nemesv связал вас в комментарии, это приводит к catastrophic backtracking. Однако, если вы сопоставляете буквенный период внутри группы, то каждое повторение всей группы имеет, чтобы закончить период, и, следовательно, нет экспоненциального количества комбинаций.

Чтобы увидеть, что "показательное количество комбинаций" означает, я просто ссылку на двух бывших ответов моих (один с сегодняшнего дня, на самом деле):

Еще одна вещь, почему ваш шаблон терпит неудачу (катастрофическое обратное отслеживание в основном является проблемой для неудачных совпадений): вам нужен только один символ после первой косой черты.Вы, наверное, хотели, чтобы произвольно длинный путь и строки запроса, поэтому добавьте + к этому классу персонажа:

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

Однако, в общем, зачем изобретать велосипед, а не просто googling for established URL regex patterns.

+0

Спасибо, измените красиво. – Banshee

2

MVC уже имеет проверку URL с помощью UrlAttribute:

[Url] 
public string Url { get; set; } 

Если вы используете MVC 4 будет также создать HTML 5 <input type="url"> элемент.

Проверка на стороне клиента будет использовать jQuery Validation's URL rule, который по-прежнему является регулярным выражением, но гораздо лучшим (например, он поддерживает больше символов Unicode).

Смежные вопросы