我有一个基于角色的身份验证系统:不同的角色被重定向到不同的文件夹,并且每个文件夹中都有一个 web.config,仅允许访问特定的用户名。
很少有角色具有与 GridView 相同的默认页面, GridView 根据角色以不同的方式使用react(显示不同的列,事件触发不同的方法等)。
所以我的问题是,每次我需要对页面进行细微更改时,我都需要将相同的更改复制/粘贴到其他文件夹中的所有其他默认页面。
就代码而言,我通过创建一个扩展 System.Web.UI.Page 的 DefaultFather 类来解决,并且每个其他 Default 类都继承自 DefaultFather。这样,如果我不声明Page-life-method,就会触发DefaultFather方法。
但是图形部分(html、javascript、asp 组件等)呢??
我只是为默认页面创建了一个 NestedMasterPage,但每次我需要更改控件(gridview、按钮、链接按钮)的外观/行为时,我都必须使用 FindControl() 方法。
真的没有其他方法可以解决这个问题吗? 我正在考虑使用 Page_Load() 方法通过 FindControl() 搜索每个控件并将它们保存到属性中以供以后使用,但这看起来并不是一个好的解决方案。 如果我可以使用母版页组件作为属性,那就太好了,但我认为为了做到这一点,我应该创建公共(public)属性,而且我不知道它是否会导致某种安全问题。
有什么建议吗?
顺便说一句,如果母版页是解决方案,我是否应该删除 DefaultFather 类并将代码直接放入母版页中?或者为代码创建另一个类是个好主意吗?
最佳答案
我想说,为页面同时拥有母版页和基类并没有什么问题。它们有不同的用途。母版页通常与布局有关,而基类与页面功能有关。
如果您想操作母版页上的标记,而不是直接访问字段,我会说创建一个逻辑函数来执行您需要它执行的操作,然后让母版页执行此操作。
// 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.
以避免堆栈溢出。
关于asp.net - 使用 MasterPage 属性作为属性来扩展 ASP.NET Page,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15935663/