使用MasterPage属性作为属性扩展ASP.NET页面
我有一个基于身份验证角色的系统:不同的角色被重定向到不同的文件夹,每个文件夹中都有一个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类,并将代码直接放入主页面?或者为代码创建另一个类是否是一个好主意?
我想说,为您的页面同时拥有母版页和基类没有任何问题。他们有不同的目的。母版页通常都是关于布局的,基类是关于页面功能的。
如果你想在你的母版页上操作标记,而不是直接访问这些字段,我会说创建一个逻辑函数来完成你需要的操作,并让母版页执行它。
// 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.
避免堆栈溢出。
有趣的是,事件呢?我如何回应示例的OnClick事件? – Simone 2013-04-10 21:24:02
请参阅我的编辑示例。 – 2013-04-10 21:40:53
我不能只声明:private SiteMaster master;并在默认类的Page_Init()中初始化它?对我来说,使用新的东西可能会导致问题,这似乎更容易。还有最后一件事,如果我可以......那么现在我有一个主文件和一个基本的DefaultFather类,以及其他一些扩展了DefaultFather的默认类。如果我问一个关于如何处理基于不同的default.aspx应该采取不同行为的OnClick()事件的例子,这是否太多了? – Simone 2013-04-10 21:53:30