出于某种原因, 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认为它需要破坏它?
答案 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属性并不明智,但我发现处理它的最佳方法是:
答案 5 :(得分:0)
它可能有点hacky,但问题解决了,看起来“有些”像普通的HTML。
<link <% this.Response.Write( "href=\"" + Links.Content.Site_css + "\""); %> rel="stylesheet" type="text/css" />
请注意,在这个例子中,我是T4MVC。由Chris Porter发布,问题是 href 。通过调用Response.Write,你可以解决这个问题。享受!