У меня возникло очень странное поведение в ASP.NET MVC3. В основном я написал HttpModule, который запускает BeginRequest, который потенциально перезаписывает мой URL-адрес, используя HttpContext.RewritePath(string)
. В большинстве случаев это работает правильно, но я заметил, что когда у меня есть место в моем URL-адресе, ASP.NET MVC ведет себя по-разному при перезаписи.MVC3 Пользовательский URL-адрес Rewriter HttpModule RouteData corporation
Пример URL:
http://www.mysite.com/my%20url
Мой ReWriter устанавливается с Regex, подобно Геликона, где он может захватить группу и использовать эту захваченную группу в переписывании. Пример правило:
<add original="^/(.*)\?test$" rewritten="/$1" />
Это переписать URL, такие как http://www.mysite.com/my%20url?test
< к http://www.mysite.com/my%20url
- обратите внимание, что строки запроса уходит. Это работает правильно.
И моя маршрутизация MVC настроена на захват части my%20url
с помощью подстановочного знака, чтобы сопоставить его с значением RouteData под ключом «navstate». Правило выглядит следующим образом:
"{*navstate}"
Так что, когда я не переписать, мой RouteDataDictionary содержит:
key: "navstate" value: "my url"
Когда я DO переписать, мой RouteDataDictionary содержит:
key: "navstate" value: "my%20url"
Обратите внимание, что это не URL-адрес Декодирование переменной RouteData.
У кого-нибудь есть идеи по этому поводу? Единственное, что, кажется, имеет значение, это использование HttpContext.RewritePath(string)
в моем HttpModule ... Отключение модуля обеспечивает правильную функциональность. Ручное декодирование URL-адреса перед вызовом перезаписи с использованием HttpUtility.UrlDecode(string)
также заставляет его работать ... но чувствует себя взломанным.
EDIT:
Это, кажется, ошибка не с MVC, но с ASP.NET маршрутизации, поэтому я обновил теги как таковой.
Справедливо. Имеет смысл, что если декодирование произошло раньше моего события BeginRequest, мне нужно было бы повторно декодировать мой переписанный URL. Спасибо Скотту - я очень ценю исследования и последующие действия. Стоит ли заставлять декодировать назначение RouteDataDictionary в будущей сборке сборки маршрутизации? – Haney