不确定派生页面是否与此处的问题实际相关,但是对于我目前正在处理的一些代码遇到了一个有趣的问题。
我有一个自定义母版页类,它派生自System.Web.UI.MasterPage,因此可以使用其他有用的属性进行扩展。
使用此主页的页面顶部有一个声明(请注意正在设置的页面标题)。
<%@ Page Language="C#" MasterPageFile="~/MasterPages/Landing.master" AutoEventWireup="true" CodeFile="Index.aspx.cs" Inherits="Index" Title="Welcome to the site" %>
此外,母版页在头部有样式表引用,它们是从配置文件中定义的CDN中提取的。
<head id="Head1" runat="server">
<link rel="stylesheet" type="text/css" href="<%= CDN %>/css/main.css" />
</head>
现在上面的示例显然不起作用,因为head容器中的runat属性意味着链接中的代码块是静态文本,并在生成的html中按原样呈现。
如果我从head移除runat属性,CDN可以工作,但现在我注意到不再设置Title。如果我调试,并尝试在立即窗口中访问Page.Title,我得到一个例外:
// Using the Title property of Page requires a header control on the page. (e.g. <head runat="server" />).
所以,有没有办法从声明中获取页面标题,将我自己的标题占位符放在头部并从主页面代码设置中设置它,或者,是否有更好的方法来动态设置样式表的CDN域名?我认为我能做的唯一方法是构建整个html链接标记并将其附加到标题控件,但我认为可能有更优雅的解决方案,所以我先问这里。
答案 0 :(得分:0)
在您的母版页中,您可以创建如下例程:
Public Sub AddStyleSheetLink(ByVal fileName As String, Optional ByVal media As String = "all")
Dim stylesheetLink As New HtmlLink
With stylesheetLink
.Attributes("href") = fileName
.Attributes("type") = "text/css"
.Attributes("rel") = "stylesheet"
.Attributes("media") = media
End With
MasterHeader.Controls.Add(stylesheetLink)
End Sub
在你的Page_Init(继承你的母版页的页面)中,有这样的东西
CType(Master, MasterPage).AddStyleSheetLink(CND & "/css/main.css")
您可以动态添加所需内容而不会弄乱你的&lt; head&gt;标签和页面标题。
答案 1 :(得分:0)
就CDN而言,我们构建了一个特殊的Url.ResolveContentUrl()方法,该方法与我们的配置对话,并根据运行模式等指向正确的样式表(以及任何其他静态资产)。因此,您的开发和QA工作在本地,然后您的生产转到CDN,代码更改为零。
此外,您应该将内容占位符放入母版页的部分。这是唯一的飞行方式。