ASP.NET Webform css链接被破坏

时间:2009-06-12 16:06:35

标签: c# asp.net webforms

出于某种原因, webforms 母版页中的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>

为什么这适用于脚本标记,但是会破坏链接标记而不是实际执行包含的代码。如果我将'link'标记更改为'script'标记(这是错误的但是出于测试目的),它会生成我期望的正确html。为什么ASP.NET会破坏我的Css的链接标记而不是javascript的脚本标记?

是否有一些关于链接标记的特殊内容让ASP.NET认为它需要破坏它?

6 个答案:

答案 0 :(得分:3)

这是一个基于方法的单独答案,可能更符合您的要求。我发现字符串重整的原因是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方法,并且对字符串“&lt;%= MyNamespace.Helpers.UrlHelper.CssRoot%&gt; Site.css”使用ResolveClientUrl。使用“〜/”URL字符串的解决方案不受此影响,因为ResolveClientUrl能够理解该表示法。

此时我看到了两个解决方案。 1)使用Edit#2方法在Page_Load或Page_PreRender期间将帮助程序的URL字符串注入元素,或2)创建自己的HtmlLink元素的Overrriden版本,该版本不尝试使用ResolveClientUrl。 #1绝对是更容易的解决方案。

希望这有助于解决这个问题。

答案 1 :(得分:1)

或许解决方案是从主页的代码隐藏中指定您的<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));
}

答案 2 :(得分:0)

尝试元素

中的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事件注入link元素。您将需要使用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

答案 3 :(得分:0)

您可以尝试更改

<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" />

请注意第二个实例上的单引号

答案 4 :(得分:0)

ASP.NET团队使链接标记自动调整其href属性并不明智,但我发现处理它的最佳方法是:

  1. 将链接标记动态插入Literal控件。
  2. 从头标记中删除runat =“server”。

答案 5 :(得分:0)

它可能有点hacky,但问题解决了,看起来“有些”像普通的HTML。

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

请注意,在这个例子中,我是T4MVC。由Chris Porter发布,问题是 href 。通过调用Response.Write,你可以解决这个问题。享受!