ASP.NET MVC 2 клиентская проверка запуска некорректно - PullRequest
0 голосов
/ 01 декабря 2010

Я использую 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})*)?"

Сообщение = "Неверный URL"

Просмотр

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

Результат с URL = 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 ]

1 голос
/ 01 декабря 2010

Я вижу несколько проблем с этим регулярным выражением, но то, что сбивает вас с толку, это, вероятно, запятая в p=7,8.Ваше регулярное выражение не соответствует этому, но IsMatch не требует этого;это очень приятно останавливаться на 7.Я предполагаю, что валидатор на стороне клиента неявно привязывает совпадение.В любом случае регулярное выражение должно быть привязано;добавьте ^ в начало и $ в конец, и вы должны как минимум получить последовательные результаты.Затем вы можете изменить регулярное выражение для размещения запятой.

В регулярном выражении также есть опечатка: второй f в [a-fA-f\d] должен быть F.И хотя ошибка не в том, чтобы \d и \w были в одном наборе квадратных скобок, это избыточно;\w соответствует цифрам и буквам, поэтому вы можете удалить \d[\w\d] можно уменьшить до \w).Наконец, {2,2} должно быть просто {2}.

0 голосов
/ 03 января 2011

Алан Мур был в основном прав, регулярное выражение было мусором. Я использовал это регулярное выражение .

Кроме того, вот правильный способ написания модульного теста:

[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));
}
0 голосов
/ 01 декабря 2010

Поскольку он проходит модульное тестирование, проблема может быть в вашем контроллере или модели. Доступ к Url напрямую?

...