2013-04-10 76 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