2010-02-26 91 views
9

我在我的ASPX側下面的代碼:ASP.Net更改母版頁編程

<%@ Page Language="C#" MasterPageFile="~/masterpages/standard.Master" .... %> 
<%@ MasterType VirtualPath="~/masterpages/standard.Master" %> 

我使用VirtualPath在我的母版訪問性能。 到目前爲止,這麼好。

但是,現在我必須以編程方式更改主頁。 我知道,改變一個母版頁,我對page_init做:

Page.MasterPageFile = "~/masterpages/myNewMasterPage.Master"; 

但我不知道如何改變VirtualPath。

回答

2

我假設你正在使用的MasterType因爲你需要一些屬性(你也需要,如果你改變到另一個主機),讓您正在使用Master.MyButton說,推動這一進一基礎類,並使用該輸入您@MasterType聲明:

public class MasterBase : MasterPage 
{ 
    public Button MyButton; 
} 

public class standard : MasterBase 
{ 
} 
在你的頁面

現在,您聲明的MasterType樣子:

<%@ MasterType TypeName="MyNameSpace.MasterBase" %> 

現在當您更改虛擬路徑時,無關緊要,您正在訪問基礎中的屬性,兩個母版頁都相同。

0

做了一些挖掘,發現這個在ASP.NET論壇:

動態改變中的MasterType, 你應該創建一個基母版 類,並讓每一個母版從它 繼承。

然後,您可以使用該基礎MasterPage 類型作爲您的頁面的MasterType。

請參閱此link中的「強鍵入動態主文件夾 頁面」部分。

問候,

阿納斯·加尼姆

似乎是一個相當合理的做法,只要你可以做一些鑄造生活。

Source


如果你想節省一些時間,並避免做鑄件上的每一個電話,你可以在一個名爲「CurrentMaster」或諸如此類的話,然後你的基地母版類型定義一個字段在當前的MasterPage文件上使用一個條件,該文件也可以用適當的類型設置'CurrentMaster'。

MasterPage CurrentMaster; 
if (Page.MasterPageFile == "Master1") { 
    CurrentMaster = (Master1Type)Page.MasterPage; 
} 
else { 
    CurrentMaster = (Master2Type)Page.MasterPage; 
} 

Source

2

簡而言之,你不能那樣做。

您會發現,「MasterType」目錄提供了類型的信息,編譯器在編譯時使用該信息。

當你喜歡寫東西Page.MasterPage.btn1.Text = "abcd",那麼編譯器需要知道如何處理「BTN1」的一部分。它是什麼?它是一個領域?屬性?一個方法?嵌套類?或者它可能根本不存在?

要回答這些問題,編譯器需要知道Page.MasterPage表達式的類型。這正是您提供的「MasterType」指令。

的VirtualPath屬性基本上說「先走編譯其他的文件,其編譯的結果將是這個頁面的主屬性的類型」。這就是編譯器知道的。

從上面所有內容,可以得出一個結論:不僅無法在運行時更改某些屬性的類型,它也沒有任何意義 - 中的代碼已經被編譯,你不需要任何編譯時信息了!

所以出現的下一個問題是:爲什麼你想要做到這一點

如果您只是想使用在不同母版頁中聲明的不同屬性,那麼您可以採用Nick Craver和Nathan Taylor的建議,並聲明一個基類,該基類將具有所有這些字段/屬性並且繼承所有母版頁從該基類繼承,然後讓您的MasterType指令通過TypeName屬性指定該基類。

但是,我只會走這條路如果這兩個母版頁在邏輯上相似,只是在設計上有所不同。也就是說,一個頁面不應該具有其他屬性。否則,它只是不正確的具有屬性/方法/字段的兩個子集在一類(這將是基類)時只有那些子集中的一個在任何時候被使用。如果在那裏沒有真正的共同基地,那麼爲兩個班級建立一個共同的基礎是不對的。又名「壞設計」。在這種情況下,您應該重新考慮您的初始設計。

如果你的目的是一些其他的 - 請解釋一下,我會盡量拿出一些對你的解決方案。

祝你好運。

+0

Althoght你給了一個很好的答案是不是解決辦法。但由於它對於更多訪問者非常有用,我將把它標記爲Userfull。 :) – Marco 2010-02-26 20:59:04

+0

這不是一個解決方案,因爲沒有。 :-)在我的回答中,我試圖仔細解釋原因。 – 2010-02-27 13:04:09