让ASP.NET MVC正确地转义路由中的#(hash/pound)字符

Dan*_*ers 6 c# asp.net-mvc url-routing

我有一条看起来像这样的路线:

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

我使用这样的路线创建一个URL:

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

但是,当使用带有#字符的标记(如"C#")时,路由引擎不会将其转义,因此我得到一个如下所示的URL:

<a href="/Blog/Tags/C#">C#</a>
Run Code Online (Sandbox Code Playgroud)

我需要的是#swardped,所以它看起来像这样:

<a href="/Blog/Tags/C%23">C#</a>
Run Code Online (Sandbox Code Playgroud)

我在标签进入路线之前尝试在标签上做一个Url.Encode,如下所示:

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

但是这会使路由引擎双重转义#(导致ASP.NET崩溃并出现错误的请求错误)):

<a href="/Blog/Tags/C%2523">C#</a>
Run Code Online (Sandbox Code Playgroud)

我怎样才能让路由引擎正确地为我转义#字符?

提前谢谢你的帮助.

小智 1

作为一个非常秃头的解决方案,我会在 RouteLink 的输出中手动将“#”替换为“%23”。如果您不在网址中使用片段,它应该可以工作。

您可以使用正则表达式仅将替换应用于网址的最后部分。