2

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

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

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

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

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

我仅为默认页面创建了一个 NestedMasterPage,但每次我需要更改控件的外观/行为(gridview、按钮、链接按钮)时,我都必须使用 FindControl() 方法。

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

有什么建议吗?

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

4

1 回答 1

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) { }

另请参阅我对 Master 包装器的编辑 - 您需要在base.那里避免堆栈溢出。

于 2013-04-10T20:32:46.090 回答