2011-03-09 56 views
2

不確定派生頁面是否與這裏的問題實際相關,但在我正在處理的一些代碼中遇到了一個有趣的問題。asp.net派生的主頁面,頁面標題和動態CSS鏈接

我有一個自定義masterpage類,它從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> 

現在上面明顯的例子是不行的,因爲在頭容器runat屬性意味着在該鏈接的代碼塊靜態文本,並原樣呈現,在生成的HTML。

如果我從頭上刪除runat屬性,CDN的作品,但現在我注意到,標題不再被設置。如果我調試,並嘗試訪問Page.Title在立即窗口,我得到一個異常:

// Using the Title property of Page requires a header control on the page. (e.g. <head runat="server" />). 

所以,是有一種方式來獲得從聲明的頁面標題,把我自己的標題佔位符頭部並從主頁面代碼隱藏中設置它,或者,有沒有更好的方法來動態設置樣式表的CDN域?我認爲我可以做到的唯一方法是構建完整的html鏈接標記並將其附加到標題控件,但我認爲可能會有更優雅的解決方案,所以我先問這裏。

回答

0

就CDN而言,我們構建了一個特殊的Url.ResolveContentUrl()方法,它與我們的配置保持一致,並根據運行模式等指向正確的樣式表(以及任何其他靜態資源)。因此,您的開發人員和QA在本地工作,然後您的產品進入零代碼更改的CDN。

另外,您應該將內容佔位符放入主頁的部分。這是飛行的唯一方法。

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

您可以動態地添加你需要的東西,而不會搞亂你的頭>標籤和頁面標題。