使用MasterPage属性作为属性扩展ASP.NET页面

时间:2013-04-10 20:21:20

标签: asp.net master-pages

我有一个基于身份验证角色的系统:不同的角色被重定向到不同的文件夹,每个文件夹中都有一个web.config,只允许访问特定的用户名。

很少有角色具有与gridview相同的默认页面,该视图根据角色以不同的方式作出反应(显示不同的列,事件触发不同的方法等)。

所以我的问题是,每当我需要对页面进行细微更改时,我需要将相同的更改复制/粘贴到其他文件夹中的所有其他默认页面。

在代码方面,我通过创建一个扩展System.Web.UI.Page的DefaultFather类来解决,并且每个其他Default类都继承自DefaultFather。这样,如果我不声明Page-life-method,将触发DefaultFather方法。

但是图形部分(html,javascript,asp组件等等)呢?

我为Default页面创建了一个NestedMasterPage,但每次我需要更改控件的外观/行为(gridview,buttons,linkbuttons)时,我必须使用FindControl()方法。

还有另一种方法可以解决这个问题吗? 我想使用Page_Load()方法搜索FindControl()的每个控件,并将它们保存到属性中供以后使用,但它看起来不是一个好的解决方案。 如果我可以使用母版页组件作为属性会很好,但我认为为了做到这一点我应该创建公共属性,我不知道它是否会导致某种安全问题。

任何建议?

顺便说一句,如果母版是解决方案,我应该删除DefaultFather类并将代码直接放入母版页吗?或者为代码创建另一个类是个好主意吗?

1 个答案:

答案 0 :(得分: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();

修改

根据你关于附加事件处理程序的评论 - 如果你需要将事件附加到主文件上的对象(这可能不是一个好主意 - 理想情况下,生成在主文件上的东西的事件处理程序存在于主文件上 - 但是如果你真的需要它)你也可以公开这样做的方法,比如:

// 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.以避免堆栈溢出。