ASP.NET Webform CSS ссылки становятся искаженными - PullRequest
3 голосов
/ 12 июня 2009

По какой-то причине по css-ссылке в веб-формах главная страница искажается ASP.NET.

Страница, использующая мастер-страницу, находится в /subdir1/subdir2/page.aspx

Не знаю, почему это происходит, но вот фрагмент кода:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="<%= MyNamespace.Helpers.UrlHelper.CssRoot %>Site.css" rel="stylesheet" type="text/css" />
    <script src="<%= MyNamespace.Helpers.UrlHelper.JavascriptRoot %>jquery-1.3.2.min.js" type="text/javascript"></script>
    <asp:ContentPlaceHolder ID="cphHead" runat="server">
    </asp:ContentPlaceHolder>
</head>

Выход Html, который создается:

<html xmlns="http://www.w3.org/1999/xhtml" >
<head><title>
    Untitled Page
</title><link href="../../%3C%25=%MyNamespace.Helpers.UrlHelper.CssRoot%20%25%3ESite.css" rel="stylesheet" type="text/css" />
    <script src="/Javascript/jquery-1.3.2.min.js" type="text/javascript"></script>
</head>

Почему это работает для тега script, но искажает тег link и фактически не выполняет включенный код. Если я изменю тег 'link' на тег 'script' (что неверно, но для целей тестирования), он даст правильный HTML-код, который я ожидаю. Почему ASP.NET портит мой тег ссылки для моего Css, а не тег сценария для javascript?

Есть ли что-то особенное в теге ссылки, чтобы заставить ASP.NET думать, что оно должно его исправить?

Ответы [ 6 ]

3 голосов
/ 12 июня 2009

Это отдельный ответ, основанный на подходе, и может быть больше, чем вы ищете. Причина, по которой я обнаружил искажения строк, заключается в том, что объект HtmlLink имеет внутреннюю обработку значения href во время рендеринга. Используя .NET Reflector, я нашел метод Overrides RenderAttributes. Вот код для этого:

Protected Overrides Sub RenderAttributes(ByVal writer as HtmlTextWriter)
    If Not String.IsNullOrEmpty(Me.Href) Then
        MyBase.Attributes.Item("href") = MyBase.ResolveClientUrl(Me.Href)
    End If
    MyBase.RenderAttributes(writer)
End Sub

Я считаю, что происходит то, что метод RenderAttributes вызывается до анализа вашей вспомогательной строки и использует ResolveClientUrl против строки "<% = MyNamespace.Helpers.UrlHelper.CssRoot%> Site.css". Решение об использовании URL-строк "~ /" не зависит от этого, потому что ResolveClientUrl способен понять эту нотацию.

Я вижу два решения для вас на данный момент. 1) Используйте подход Edit # 2 для вставки строки URL помощника в элемент во время Page_Load или Page_PreRender, или 2) Создайте свою собственную версию переопределения элемента HtmlLink, которая не пытается использовать ResolveClientUrl. # 1 определенно будет более простым решением.

Надеюсь, это поможет пролить свет на проблему.

1 голос
/ 12 июня 2009

Возможно, решением было бы указать теги <link> и <script> из кода вашей главной страницы.

private void ConstructLinkAndScriptTags()
{

string cssTag = "<link  href='" +   MyNamespace.Helpers.UrlHelper.CssRoot + "Site.css' rel='stylesheet' type='text/css' runat='server' />";

cph.Controls.Add(new LiteralControl(cssTag));
}
0 голосов
/ 12 января 2011

Это может быть немного хакерски, но решает проблему и выглядит "несколько" как обычный html.

<link <% this.Response.Write( "href=\"" + Links.Content.Site_css + "\""); %> rel="stylesheet" type="text/css" />

Обратите внимание, что в этом примере я пою T4MVC. Как сообщает Крис Портер, проблема в href . Позвонив в Response.Write, вы обойдете это. Наслаждайтесь!

0 голосов
/ 20 июля 2009

Было бы неразумно, чтобы команда ASP.NET заставляла теги ссылок автоматически настраивать свои атрибуты href, но лучший способ, который я нашел, - это:

  1. Динамически вставить тег ссылки в элемент управления Literal.
  2. Удалите runat = "server" из тега head.
0 голосов
/ 12 июня 2009

Вы можете попробовать изменить

<link href="<%= MyNamespace.Helpers.UrlHelper.CssRoot %>Site.css" rel="stylesheet" type="text/css" />

до

<link href='<%= MyNamespace.Helpers.UrlHelper.CssRoot %>Site.css' rel="stylesheet" type="text/css" />

Обратите внимание на одинарные кавычки во втором экземпляре

0 голосов
/ 12 июня 2009

Попробуйте runat = "server" теги в элементах

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link runat="server" href="<%= MyNamespace.Helpers.UrlHelper.CssRoot %>Site.css" rel="stylesheet" type="text/css" />
    <script runat="server" src="<%= MyNamespace.Helpers.UrlHelper.JavascriptRoot %>jquery-1.3.2.min.js" type="text/javascript"></script>
    <asp:ContentPlaceHolder ID="cphHead" runat="server">
    </asp:ContentPlaceHolder>
</head>

Редактировать: Вы должны использовать вспомогательный объект? Делает ли это больше, чем просто делает ваши ссылки динамичными? Когда задано runat = "server", иногда вы можете использовать динамические URL-адреса, используя символ ~. Вы можете попробовать это вместо этого:

<head runat="server">
    <link id="SiteCssLink" runat="server" href="~/Css/Site.css" rel="Stylesheet" type="text/css" media="all" />
</head>

Редактировать # 2: Попробуйте ввести URL-адрес в элемент ссылки из событий Page_Load или Page_PreRender в коде позади страницы. Для этого вам понадобится элемент runat = "server".

Protected Sub Page_PreRender(ByVal sender as Object, ByVal e as System.EventArgs) Handles Me.PreRender
    SiteCssLink.Href = Page.ResolveClientUrl(String.Concat(MyNamespace.Helpers.UrlHelper.CssRoot, "Site.css"))
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...