Изменение перезаписи IIS ASP. Net Бэкэнд-привязка HyperLink - PullRequest
2 голосов
/ 31 марта 2020

Я схожу с ума, может быть, кто-то здесь может сортировать это для меня.

Простое правило перезаписи:

<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 HyperLink (или стандартная ссылка A с runat = server)

Но при привязке:

HL_CustomizeCollapse.NavigateUrl = "#sample";

Вместо href используется example.com/apage/#sample. Href устанавливается на: example.com/pages/#sample

Таким образом, правило перезаписи влияет на href, когда ссылка установлена ​​из отделенный код. Все ссылки на лицевой стороне в порядке. Исходящие правила изменят их, как и ожидалось.

Этот тег не зависит от исходящих правил и зависит от входящих правил.

Понятия не имею, как решить эту проблему.

1 Ответ

0 голосов
/ 01 апреля 2020

Установщики HyperLink.NavigateUrl и a.href используют Control.ResolveClientUrl() для определения абсолютного пути для относительного пути.

Control.ResolveUrl(), с другой стороны, использует исходный виртуальный каталог текущего шаблона (который is / 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:

<code>    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("
");

Сгенерирован следующий вывод:

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 (), чтобы установить свойства NavigationUrl и href HyperLink и A. соответственно.

Надеюсь, это помогает.

Удачи.

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