2

不确定派生页面是否真的与这里的问题相关,但在我目前正在处理的一些代码上遇到了一个有趣的问题。

我有一个自定义母版页类,它派生自 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 链接标记并将其附加到标题控件,但我认为可能有更优雅的解决方案,所以我先在这里问。

4

2 回答 2

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

您可以动态添加您需要的内容,而不会弄乱您的 <head> 标签和页面标题。

于 2011-03-09T20:09:14.177 回答
0

就 CDN 而言,我们构建了一个特殊的 Url.ResolveContentUrl() 方法,该方法与我们的配置对话,并根据运行模式等指向正确的样式表(和任何其他静态资产)。因此,您的开发人员和 QA 在本地工作,然后是您的生产以零代码更改进入 CDN。

此外,您应该将内容占位符放入母版页的一部分。这是唯一的飞行方式。

于 2011-03-09T20:17:33.623 回答