2012-02-21 2 views
0

мои маршруты:Как поступить «+» в asp.net mvc3?

routes.MapRoute(
    "Tag", 
    "tag/{t}/{action}", 
    new { controller = "tag", action = "unsolved" } 
    ); 

ссылку, как:

<a href="/tag/@(Uri.EscapeDataString(tagName))/unsolved">@tagName</a> 

если тэгу не содержат "+", все работают хорошо, иначе, как «http://www.test.com/ tag/c% 2B% 2B/unsolved "(% 2B пришло из @ (Uri.EscapeDataString (" + ")), я получаю ошибку: ошибка HTTP 404.11 - не найдено

кто может мне помочь? спасибо

ответ

4

Вы можете попробовать что позволяет двойное экранирование в <system.webServer> части вашего web.config, как я подозреваю, что вы с этой проблемой только в IIS 7, а не в зрительном сервер разработки студии (который, кстати, вы должны были упомянуты в вашем вопросе):

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false"/> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    <security> 
     <requestFiltering allowDoubleEscaping="true"/> 
    </security> 
</system.webServer> 

Дальнейшее чтение: http://www.hanselman.com/blog/ExperimentsInWackinessAllowingPercentsAnglebracketsAndOtherNaughtyThingsInTheASPNETIISRequestURL.aspx

+0

по какой-то причине, я не мог изменить web.config, это есть другое решение? – artwl

+1

@artwl, no. В этом случае вам придется заменить этот символ чем-то другим. Веб-сервер не позволит вам использовать его. Другая возможность заключается в использовании параметров строки запроса (например, '/ tags/unsolved? Tag = ...') для тегов вместо того, чтобы помещать их в часть пути. –

+0

Thx @Darin, я понятия не имел, что между IIS и Casini существует разница, вы просто спасли мне массу времени. – sisdog

0

Ваше веб-приложение MVC генерирует ссылку, которая включает любой символ (%, +,/и т. д.). Поэтому использовать URL кодировать строку и сгенерировать ссылку:

new UrlHelper(HttpContext.Current.Request.RequestContext) 
     .RouteUrl("Tag", 
       new { tagName= HttpContext.Current.Server.UrlEncode(tagName) }; 
Смежные вопросы