如何使用等效的Control.ResolveUrl来解析样式表的相对URL?

时间:2011-08-11 14:41:29

标签: asp.net webforms asp.net-4.0

我使用以下样式来确保无论当前页面的URL是什么,所有脚本文件总是被加载,即呈现正确的URL。

<script src='<%= ResolveUrl("~/Scripts/jquery-1.4.1.js")%>' type="text/javascript" />

然而,当我尝试使用样式表的类似方法时,如下所示,将呈现实际代码。

<link href='<%=  ResolveUrl("~/Styles/Blueprint/src/reset.css") %>' rel="stylesheet" type="text/css" />

为什么会这样,我怎样才能实现我的目标,但未能使用第二个例子?

2 个答案:

答案 0 :(得分:1)

这可能是因为你的head元素已经应用了runat =“server”属性。

我可以通过以下方式重新创建问题:

<head runat="server">
    <link href='<%=  ResolveUrl("~/Styles/Blueprint/src/reset.css") %>' rel="stylesheet" type="text/css" />
</head>

删除该属性后,它会按预期解析URL。


修改

似乎头元素被定义为作为服务器控件运行,然后其中的元素也可以被后面的代码访问,而不需要将它们标记为服务器控件。

例如:

<link id="link1" href='<%=  ResolveUrl("~/Styles/Blueprint/src/reset.css") %>' rel="stylesheet" type="text/css" />

可以作为HtmlLink控件从后面的代码访问,即使它没有使用runat =“server”属性标记。

这解释了你在href属性中看到的代码,因为它是一个服务器控件属性,它将它视为文字文本。

奇怪的是title元素的行为方式相同,并且在后面的代码中可以作为HtmlTitle对象使用,但脚本标记不是,并且需要在它变为可见之前显式定义为runat =“server背后的代码。

据我所知,你有两种选择:

1 - 直接设置href属性:

<link rel="stylesheet" type="text/css" href="~/Styles/Blueprint/src/reset.css" />

这与使用Page.ResolveClientUrl具有相同的效果,并将解析样式表相对于页面的URL:

<link href="Styles/Blueprint/src/reset.css" rel="stylesheet" type="text/css" />

或者

2 - 将您的链接元素定义为服务器控件(无论如何):

<link id="link1" runat="server" rel="stylesheet" type="text/css" />

并在后面的代码中设置网址:

link1.Href = ResolveUrl("~/Styles/Blueprint/src/reset.css");

这解析了URL链接:

<link id="link1" rel="stylesheet" type="text/css" href="/Styles/Blueprint/src/reset.css" />

希望这有帮助。

答案 1 :(得分:0)

我发现以下方法效果很好,而且我认为它还可以提供更整洁的<head>标记:

<head id="Head1" runat="server">
    <title>Lightstone AVM</title>
    <style type="text/css">
        @import '<%# ResolveUrl("~/Styles/Blueprint/src/reset.css")%>';
        @import '<%# ResolveUrl("~/Styles/Blueprint/src/grid.css")%>';
        @import '<%# ResolveUrl("~/Styles/Site.css")%>';
        @import '<%# ResolveUrl("~/Styles/Master.css")%>';
        @import '<%# ResolveUrl("~/Styles/Nav.css")%>';
    </style>
</head>

请注意使用数据绑定表达式而不是代码渲染块。这是遵循Milan NegovanCode Blocks Inside Master Pages Cause Trouble文章中的建议,该文章很好地处理了这个奇怪的问题。

NB :此方法确实需要为您的母版页提供以下最小代码:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    Parent.DataBind()
    DataBind()
End Sub