Правило соответствия Urlrewriter.net возвращает много - PullRequest
0 голосов
/ 09 марта 2012

Это наше правило перезаписи:

<rewrite url="/Product/(.+)/" to="~/ProductDetails?ProductID=$1" />

и отлично работает для

www.website.com/product/34/nice-red-jacket

тогда мы получим ProductID=34

Но он терпит неудачу, как только в URL появляется еще один слеш вперед

www.website.com/product/34/nice-red-jacket/special-edition/buy-now/

Результат ProductID=34%2fnice-red-jacket%2fspecial-edition%2fbuy-now

Нам нужно изменить наше правило перезаписи, чтобы прекратить сопоставление в первом / следующем слэше, но как нам это сделать?

1 Ответ

1 голос
/ 13 марта 2012

Попробуйте это выражение

^/Product/(\d+)/?.*$

<rewrite url="^/Product/(\d+)/?.*$" to="~/ProductDetails?ProductID=$1" />

Первая группа (\d+) означает совпадение хотя бы с одной цифрой, представляющей идентификатор, за которым может следовать или нет символ /, а затем любой символ,^ and $ отмечает начало и конец матча.

Вот некоторые тестовые данные

var reg = new Regex(@"^/Product/(\d+)/?.*$");

var urls = new []
    { 
        "/Product/1",
        "/Product/2/23/asd",
        "/Product/3/21334/asd/",
        "/Product/5/32/asd/asd",           
    };

urls.Select(url=> reg.Replace(url,"~/ProductDetails?ProductID=${1}"))
    .Dump();
...