Получение ASP.NET MVC для правильного экранирования символа # (хэш / фунт) в маршрутах - PullRequest
6 голосов
/ 04 февраля 2010

У меня есть маршрут, который выглядит так:

routes.MapRoute(
"BlogTags",
"Blog/Tags/{tag}",
new { controller = "Blog", action = "BrowseTag", viewRss = false }
);

И я создаю URL, используя этот маршрут следующим образом:

<%= Html.RouteLink(Html.Encode(sortedTags[i].Tag), 
         new { action = "BrowseTag", tag = sortedTags[i].Tag })%>

Однако, когда используется тег с символом # (например, «C #»), механизм маршрутизации не может его избежать, поэтому я получаю URL, который выглядит следующим образом:

<a href="/Blog/Tags/C#">C#</a>

Что мне нужно, так это # ​​экранировать, чтобы он выглядел так:

<a href="/Blog/Tags/C%23">C#</a>

Я пытался сделать Url.Encode для тега, прежде чем он ушел в маршрут, например:

<%= Html.RouteLink(Html.Encode(sortedTags[i].Tag), 
         new { action = "BrowseTag", tag = Url.Encode(sortedTags[i].Tag) })%>

Но это заставляет механизм маршрутизации дважды избегать # (что приводит к аварийному завершению ASP.NET с ошибкой неверного запроса):

<a href="/Blog/Tags/C%2523">C#</a>

Как я могу заставить механизм маршрутизации корректно экранировать этот символ # для меня?

Заранее благодарю за помощь.

Ответы [ 2 ]

1 голос
/ 04 февраля 2010

Как очень простое решение, я бы вручную заменил "#" на "% 23" в выходных данных RouteLink. При условии, что вы не используете фрагменты в своих URL, это должно работать.

Вы можете использовать регулярное выражение, чтобы применить замену только к последней части вашего URL.

0 голосов
/ 04 февраля 2010

У меня аналогичный вопрос SO , касающийся "/". Исследуя эту проблему, я узнал, что ASP.NET декодирует значения URL до , и они передаются в инфраструктуру MVC, и, поскольку "#" имеет особое значение для URL (точно так же, как "/", с которым я имел дело ) есть большая вероятность, что что-то в базовом механизме маршрутизации вызывает такое поведение.

Как Леви упоминал в своем комментарии, одним из решений является использование ASP.NET 4.0. Другим решением было бы написать помощник RouteLink, который автоматически заменяет «#» каким-либо маркером (например, «! MY_HASH_TOKEN!»), А затем отменить эту замену в вашем контроллере (или, возможно, с помощью какого-либо модуля HttpModule).

Или просто добавьте полотенце и передайте значение тега в качестве аргумента строки запроса. Не так сексуально, но все просто и работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...