Как мне указать ссылки в ASP.NET пользовательские элементы управления при использовании IIS 7 Переписывают URL-адрес?

#asp.net #hyperlink #url-rewriting

#asp.net #гиперссылка #перезапись URL-адреса

Вопрос:

У меня возникли некоторые трудности с получением URL-адресов в пользовательских элементах управления для работы прямо в моем ASP.NET 4 веб-сайт при использовании правил перезаписи URL-адресов. В частности, похоже, что элемент гиперссылки изменяет мои URL-адреса ссылок. Я не уверен, использую ли я правильную технику или что-то упускаю.

У меня есть физическая структура каталогов, которая выглядит следующим образом:

  • Root
    • страница 1.aspx
    • страница 2.aspx
    • styles.css
    • Мастера
      • site.master
    • UserControls
      • header.ascx

страница 1.aspx использует site.master, а site.master содержит header.ascx.

Я также настроил модуль перезаписи URL, чтобы запросы типа:

перенаправляются на:

Все работает нормально.

Однако некоторые ссылки в пользовательском элементе управления разрешаются некорректно.

Вот site.master:

 <%@ Master Language="C#" AutoEventWireup="true" CodeFile="site.master.cs" Inherits="Masters_site" %>
<%@ Register Src="../UserControls/header.ascx" TagName="Header" TagPrefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
    <base href="http://localhost/mysite/"></base>
    <link href="../styles.css" type="text/css" rel="stylesheet" />
</head>
<body>
    <form id="form1" runat="server">
        <uc1:Header ID="Header1" runat="server" />
        <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" />
    </form>
</body>
</html>
  

Обратите внимание, что я использую тег HTML <base>, чтобы гарантировать, что содержимое всегда извлекается из корня веб-сайта. Это упрощает использование и ссылки в css, которые не зависят от пути страницы.

А вот пользовательский элемент управления с некоторыми тестовыми ссылками:

 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="header.ascx.cs"
    Inherits="header" %>
<a href="page2.aspx">Page 2</a>
<asp:HyperLink ID="lnkPage1" runat="server" NavigateUrl="page2.aspx">Page 2</asp:HyperLink>
<asp:HyperLink ID="lnkPage2" runat="server" NavigateUrl="/page2.aspx">Page 2</asp:HyperLink>
<asp:HyperLink ID="lnkPage3" runat="server" NavigateUrl="../page2.aspx">Page 2</asp:HyperLink>
<asp:HyperLink ID="lnkPage4" runat="server" NavigateUrl="~/page2.aspx">Page 2</asp:HyperLink>
  

Мне нужна ссылка, которая просто отображается как «page2.aspx», чтобы браузер преобразовал ее в http://localhost/mysite/page2.aspx .

Хотя это отлично работает для ссылки <a>, это работает не так, как хотелось бы для гиперссылки (или ссылки на таблицу стилей в главном, если на то пошло).

При переходе прямо к http://localhost/mysite/page1.aspx без перезаписи я получаю это для гиперссылки (исходная, визуализированная, используемая браузером).:

When I go to http://localhost/mysite/page/a:

Когда я перехожу к http://localhost/mysite/page/a/b:

Я не могу с помощью элемента управления гиперссылкой остановить изменение ссылки.

У меня аналогичная проблема с этим в site.master, где он не может найти файл при перезаписи с помощью /a /b.

Вопрос 1. Как мне запретить ссылкам изменять URL-адрес? Вопрос 2. Существует ли лучший метод для выполнения вышеуказанного без побочных эффектов?

Я должен также упомянуть, что у меня возникла эта проблема только с модулем перезаписи URL IIS7. У меня не было этой проблемы с одним и тем же веб-сайтом и перезаписью Helicon ISAPI, поэтому я думаю, что перезапись URL-адреса не подходит для ASP.NET .

Еще одна вещь; когда я отправляю это на рабочий сервер, URL-адрес меняется на «http://mysite » поэтому любое решение должно учитывать это.

Заранее спасибо за вашу помощь!

ОБНОВЛЕНИЕ 28.10.2011

Меня попросили показать правило перезаписи для этого примера:

 <rewrite>
    <rules>
        <clear />
        <rule name="Rewrite category" stopProcessing="true">
            <match url="^page/(.*)$" />
            <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="page1.aspx?p={R:1}" appendQueryString="false" />
        </rule>
    </rules>
</rewrite>
  

Комментарии:

1. 1. Можем ли мы увидеть раздел правила перезаписи? 2. Вы пробовали то же самое без базового оператора? У нас никогда не было проблем с использованием IIS 7 rewrite.

2. @Olaf, как бы вы поступили со ссылками (например, фоновыми изображениями) в CSS без инструкции base. Я не могу размещать ссылки типа «фоновое изображение: url ( localhost/mysite/Images/sample.gif )», поскольку они будут сломаны на рабочем сервере. Если я использую /Images/sample.gif затем в моем окне разработки, которое преобразуется в localhost /Images… а не localhost/ mysite /Images…

3. Я бы включил отслеживание неудачных запросов .

4. @Uwe, спасибо, трассировка неудачных запросов включена, но если я что-то не упустил, я не уверен, как это поможет с этим. Я использовал Fiddler и View Source, чтобы увидеть, что создается на веб-странице. Браузер запрашивает ресурс в неправильном месте из-за того, что гиперссылка изменяет URL-адрес в сочетании с базовым оператором.