2013-04-10 74 views
2

我有一個基於身份驗證角色的系統:不同的角色被重定向到不同的文件夾,每個文件夾中都有一個web.config,它只允許訪問特定的用戶名。使用MasterPage屬性作爲屬性擴展ASP.NET頁面

很少有角色具有與GridView相同的默認頁面,它們根據角色(顯示不同的列,事件觸發不同的方法等)以不同的方式作出反應。

所以我的問題是,每次我需要對頁面進行微小更改時,我需要將相同的更改複製/粘貼到其他文件夾中的所有其他默認頁面。

就我通過創建一個DefaultFather類來解決的代碼而言,該類擴展了System.Web.UI.Page,並且每個Default類都從DefaultFather繼承。這樣,如果我不聲明一個Page生活方法,DefaultFather方法將被觸發。

但是圖形部分(html,javascript,asp組件等)呢?

我爲Default頁面創建了一個NestedMasterPage,但每次我需要更改控件(gridview,buttons,linkbuttons)的外觀/行爲時,我必須使用FindControl()方法。

還沒有真正的另一種方法來解決這個問題? 我想使用Page_Load()方法使用FindControl()搜索每個控件,並將它們保存到屬性中供以後使用,但它看起來確實不是一個好的解決方案。 這將是很好,如果我可以使用masterpage組件作爲屬性,但我認爲爲了做到這一點,我應該創建公共屬性,我不知道它是否會導致某種安全問題。

有什麼建議嗎?

順便說一句,如果masterpage是解決方案,我應該刪除DefaultFather類,並將代碼直接放入主頁面?或者爲代碼創建另一個類是否是一個好主意?

回答

2

我想說,爲您的頁面同時擁有母版頁和基類沒有任何問題。他們有不同的目的。母版頁通常都是關於佈局的,基類是關於頁面功能的。

如果你想在你的母版頁上操作標記,而不是直接訪問這些字段,我會說創建一個邏輯函數來完成你需要的操作,並讓母版頁執行它。

// Site.Master.cs 
public void HideSubmitButton() 
{ 
    btnSubmit.Visible = false; 
} 

// Default.aspx.cs 
protected void Page_Load(object sender, EventArgs e) 
{ 
    ((SiteMaster)Master).HideSubmitButton(); 
} 

我可能會換行投讓您可以更輕鬆地使用它 - 那是後話,那些只屬於你的基類:

// DefaultFather.cs 
protected new SiteMaster Master { get { return (SiteMaster)base.Master; } } 

// Default.aspx.cs 
Master.HideSubmitButton(); 

編輯

根據您的意見關於附加事件處理程序 - 如果您需要將事件附加到生活在主人身上的對象(這可能不是一個好主意 - 理想情況下,生活在主人身上的東西的事件處理程序生活在主人身上 - 但如果您真的需要它)可以e xpose方法來做到這一點爲好,如:

// Site.Master.cs 
public void AttachEventHandlerToGoButton(EventHandler eventHandler) 
{ 
    btnGo.Click += eventHandler; 
} 

// Default.aspx.cs 
Master.AttachEventHandlerToGoButton(DoMyThing); 

private void DoMyThing(object sender, EventArgs e) { } 

,或者如果你想獲得幻想,編寫一個包裝事件:

// Site.Master 
<asp:Button ID="btnGo" runat="server" OnClick="btnGo_Click" /> 

// Site.Master.cs 
public event EventHandler GoButtonClick; 

protected void btnGo_Click(object sender, EventArgs e) { 
    if (GoButtonClick != null) { 
     GoButtonClick(sender, e); 
    } 
} 

// Default.aspx.cs 
Master.GoButtonClick += DoMyThing; 

private void DoMyThing(object sender, EventArgs e) { } 

也看到我的主包裝編輯 - 你需要的base.避免堆棧溢出。

+0

有趣的是,事件呢?我如何迴應示例的OnClick事件? – Simone 2013-04-10 21:24:02

+0

請參閱我的編輯示例。 – 2013-04-10 21:40:53

+0

我不能只聲明:private SiteMaster master;並在默認類的Page_Init()中初始化它?對我來說,使用新的東西可能會導致問題,這似乎更容易。還有最後一件事,如果我可以......那麼現在我有一個主文件和一個基本的DefaultFather類,以及其他一些擴展了DefaultFather的默認類。如果我問一個關於如何處理基於不同的default.aspx應該採取不同行爲的OnClick()事件的例子,這是否太多了? – Simone 2013-04-10 21:53:30