繁体   English   中英

IIS 重写更改 ASP.Net 超链接后端绑定

[英]IIS Rewrite changing ASP.Net HyperLink Backend Bind

我快疯了,也许这里有人可以帮我解决这个问题。

简单的重写规则:

<rule name="Pages Rewrite" enabled="true" stopProcessing="true">
                <match url="^(.*?)/$" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
                    <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
                </conditions>
                <action type="Rewrite" url="pages/{R:1}.aspx" />
            </rule>

它工作正常。

所以我们把 example.com/pages/apage.aspx 改写为 example.com/apage/

一切都按预期工作。 在此页面上,我们有一个 ASP 超链接(或带有 runat=server 的标准 A 链接)

但是当绑定时:

HL_CustomizeCollapse.NavigateUrl = "#sample";

而不是 href 是 example.com/apage/#sample href 被设置为:example.com/pages/#sample

因此,当从代码隐藏设置链接时,重写规则会影响 href。 任何设置在正面的链接都很好。 出站规则将按预期更改这些规则。

该标签不受出站规则影响,受入站规则影响。

我不知道如何解决这个问题。

HyperLink.NavigateUrla.href设置器都使用Control.ResolveClientUrl()来确定相对路径的绝对路径。

另一方面, Control.ResolveUrl()使用当前模板的源虚拟目录(即 /aPage)来构建绝对路径。

因此,当请求路径/pages/apage.aspx被重新写入/apage/ ,执行以下代码作为结果:

/aPage/default.aspx

<div>
    <asp:HyperLink ID="asp_hyperlink_to_default_aspx" runat="server">
        asp_hyperlink_to_default_aspx
    </asp:HyperLink><br />
    <asp:HyperLink ID="asp_hyperlink_to_resolve_client_url_default_aspx" runat="server">
        asp_hyperlink_to_resolve_client_url_default_aspx
    </asp:HyperLink><br />
    <asp:HyperLink ID="asp_hyperlink_to_resolve_url_default_aspx" runat="server">
        asp_hyperlink_to_resolve_url_default_aspx
    </asp:HyperLink><br />
</div>

/aPage/default.aspx.cs:

    Response.Write("<pre>");

    Response.Write("ResolveClientUrl(\"Default.aspx\") = " + ResolveClientUrl("Default.aspx") + "<br/>");
    Response.Write("ResolveUrl(\"Default.aspx\") = " + ResolveUrl("Default.aspx") + "<br/>");
    Response.Write("<br/>");
    Response.Write("Request.RawUrl = " + Request.RawUrl + "<br/>");
    Response.Write("Request.Url.AbsolutePath = " + Request.Url.AbsolutePath + "<br/>");
    Response.Write("Request.AppRelativeCurrentExecutionFilePath = " + Request.AppRelativeCurrentExecutionFilePath + "<br/>");

    asp_hyperlink_to_default_aspx.NavigateUrl = "Default.aspx";
    asp_hyperlink_to_resolve_client_url_default_aspx.NavigateUrl = ResolveClientUrl("Default.aspx");
    asp_hyperlink_to_resolve_url_default_aspx.NavigateUrl = ResolveUrl("Default.aspx");

    Response.Write("</pre>");

生成以下输出:

ResolveClientUrl("Default.aspx") = Default.aspx
ResolveUrl("Default.aspx") = /aPage/Default.aspx

Request.RawUrl = /pages/apage.aspx
Request.Url.AbsolutePath = /aPage/default.aspx
Request.AppRelativeCurrentExecutionFilePath = ~/aPage/default.aspx

<div>
    <a id="ContentPlaceHolder1_asp_hyperlink_to_default_aspx" href="Default.aspx">
        asp_hyperlink_to_default_aspx
    </a><br />
    <a id="ContentPlaceHolder1_asp_hyperlink_to_resolve_client_url_default_aspx" href="Default.aspx">
        asp_hyperlink_to_resolve_client_url_default_aspx
    </a><br />
    <a id="ContentPlaceHolder1_asp_hyperlink_to_resolve_url_default_aspx" href="/aPage/Default.aspx">
        asp_hyperlink_to_resolve_url_default_aspx
    </a><br />
</div>

因此,为了保险起见,最好使用 ResolveUrl() 分别设置 HyperLink 和 A 的NavigationUrlhref属性。

希望这可以帮助。

祝你好运。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM