asp.net - 使用 MasterPage 属性作为属性来扩展 ASP.NET Page

标签 asp.net master-pages

我有一个基于角色的身份验证系统:不同的角色被重定向到不同的文件夹,并且每个文件夹中都有一个 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/

相关文章:

Jquery 对话框在母版页中不起作用?

asp.net - 如何在 masterpage.master 中访问 masterpage.master.vb 中定义的变量

ASP.NET 多个 Eval 字段

asp.net - Blazor WebAssembly : The provided ContentType is not supported;

ASP.NET Response.Redirect 使用 302 而不是 301

asp.net - 'Text' 的 'asp:TextBox' 属性不允许子对象 #2

asp.net - 在 VS 2008 嵌套母版页中包含对 JavaScript 的相对引用的首选方法

javascript - 在 asp.mvc 上连续更新时间

javascript - Masterpage.PageLoad() 中的 RegisterStartupScript 将不会在 ContentPlaceHolder 中的异步回发上运行

c# - 结果对象而不是输出参数