#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, чтобы запросы типа:
перенаправляются на:
- http://localhost/mysite/page1.aspx?p=a
- http://localhost/mysite/page1.aspx?p=a/b
- http://localhost/mysite/page1.aspx?p=a/b/c
Все работает нормально.
Однако некоторые ссылки в пользовательском элементе управления разрешаются некорректно.
Вот 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 без перезаписи я получаю это для гиперссылки (исходная, визуализированная, используемая браузером).:
- «page2.aspx» ==> «UserControls/page2.aspx» ==> http://localhost/UserControls/page2.aspx (DOES NOT WORK)
- «/page2.aspx» ==> «/page2.aspx» ==> http://localhost/page2.aspx (DOES NOT WORK)
- «../page2.aspx» ==> «page2.aspx» ==> http://localhost/mysite/page2.aspx (OK)
- «~/page2.aspx» ==> «page2.aspx» ==> http://localhost/mysite/page2.aspx (OK)
When I go to http://localhost/mysite/page/a:
- «page2.aspx» ==> «UserControls/page2.aspx» ==> http://localhost/UserControls/page2.aspx (НЕ РАБОТАЕТ)
- «/page2.aspx» ==> «/page2.aspx» ==> http://localhost/page2.aspx (НЕ РАБОТАЕТ)
- «../page2.aspx» ==> «page2.aspx» ==> http://localhost/mysite/page2.aspx (ХОРОШО)
- «~/page2.aspx» ==> «page2.aspx» ==> http://localhost/mysite/page2.aspx (ХОРОШО)
Когда я перехожу к http://localhost/mysite/page/a/b:
- «page2.aspx» ==> «../UserControls/page2.aspx» ==> http://localhost/UserControls/page2.aspx (НЕ РАБОТАЕТ)
- «/page2.aspx» ==> «/page2.aspx» ==> http://localhost/page2.aspx (НЕ РАБОТАЕТ)
- «../page2.aspx» ==> «../page2.aspx» ==> http://localhost/page2.aspx (НЕ РАБОТАЕТ)
- «~/page2.aspx» ==> «../page2.aspx» ==> http://localhost/page2.aspx (НЕ РАБОТАЕТ)
Я не могу с помощью элемента управления гиперссылкой остановить изменение ссылки.
У меня аналогичная проблема с этим в 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-адрес в сочетании с базовым оператором.