Tilde 表示法在 ASP.NET 网页 Razor V3 中使用 IIS URL 重写映射到原始 URL

本文可帮助你解决网页 Razor V3 中嵌入的超文本传输协议 (HTTP) 元素中的波形符 (~) 表示法映射到原始 URL 的问题,方法是使用 Internet 信息服务 (IIS) URL 重写。

原始产品版本: ASP.NET
原始 KB 数: 2905164

现象

在 Microsoft ASP.NET 网页 Razor V3 中,嵌入在 HTML 元素中的<A/>波形符(~)表示法,<SCRIPT/>或使用 <LINK/> IIS URL 重写映射到原始 URL。 例如,在将下面的 asp.net/content 请求重写为 URL asp.net时, href 会将其中 <A href='~/content/'/> 的属性解析为 /content/content/ ,而不是解析为 /。 因此,升级到网页 Razor V3 或 ASP.NET Model-View-Controller (MVC) 5 后,网页 Razor V2 中的页面可能无法正常工作。

原因

出现此问题的原因是 URL 中的平铺表示法行为在网页 Razor V3 中更改,以便与 ASP.NET MVC 保持一致。 在 ASP.NET MVC 中,无论 IIS URL 重写规则如何,方法中的 Url.Content 平铺表示法或 Html.ActionLink 方法都会生成原始 URL。

但是,在网页 Razor V2 中,URL 中的平铺表示法映射到启用 IIS URL 重写模块时重写的 URL。 例如,在将下面的content.asp.net请求重写为 URL asp.net/content/时,将href解析/content/book/<A href='~/book/'/>/>。 在网页 Razor V3 中,同一 href 属性将转换为 /book/浏览器的原始 URL。

解决方法

若要使用与网页 Razor V2 中相同的行为将平铺表示法解析为重写 URL,请在每个网页或 Global.asaxApplication_BeginRequest将上下文设置为 IIS_WasUrlRewritten false,如下所示:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    Context.Items["IIS_WasUrlRewritten"] = false;
}

注意

上下文的 IIS_WasUrlRewritten 更改不仅影响 HTML 元素中的平铺表示法,还影响方法中的 MVC helper 平铺表示法。 例如,如果设置为 false,则平铺表示法传入 Url.ContentHtml.ActionLink 返回重写的 URL。

详细信息

有关 Razor 语法和一些相关 MVC 方法的详细信息,请转到以下网站: