我有一个基于身份验证角色的系统:不同的角色被重定向到不同的文件夹,每个文件夹中都有一个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类并将代码直接放入母版页吗?或者为代码创建另一个类是个好主意吗?
答案 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.
以避免堆栈溢出。