【发布时间】:2011-04-23 03:47:28
【问题描述】:
我有一个解决方案,其中包含很多不同的 MasterPages / BasePages,它们都从其他地方继承。我的问题是我在 BaseMaster 中有一个虚拟字符串,它被 BaseManagement 覆盖,但是当我尝试访问这个字符串时,我总是得到基值
继承母版和页面的重点显然是避免到处都有重复的代码。
也许这与我“需要”protected void Page_Load(object sender, EventArgs e) 在每个主人身上的事实有关
所以,这是来自 Base.Master.cs 的 sn-p
public abstract partial class BaseMaster : MasterPage, IRewritablePageElement
{
public BasePage BasePage { get { return Page as BasePage; } }
public BaseMaster Self { get { return (BaseMaster)this.Page.Master; } }
public virtual string accessUri { get { return "/"; } }
public string AccessUri { get { return Self.accessUri; } }
protected void Page_Load(object sender, EventArgs e)
{
this.OnPageLoad(sender, e);
}
/// <summary>
/// If we want to do something on page load, we override the following method
/// </summary>
public virtual void OnPageLoad(object sender, EventArgs e)
{
SetCacheability();
RedirectSiteDown();
RedirectUnregisteredUsers();
RedirectUnprivilegedUsers();
if(!IsPostBack)
{
PopulateMenu();
...
正如你已经注意到的,
public BaseMaster Self { get { return (BaseMaster)this.Page.Master; } }
public virtual string accessUri { get { return "/"; } }
public string AccessUri { get { return Self.accessUri; } }
丑到极点,因为它应该是这样的
public virtual string AccessUri { get { return "/"; } }
但代码以某种方式设法一直下降到 AccessUri 为“/”的级别,即使它已在更高级别的某处被“/a/”覆盖:
public partial class BaseManagementMaster : BaseMaster
{
public override string accessUri { get { return "/a/"; } }
protected void Page_Load(object sender, EventArgs e)
{
}
}
如果不是 Self 这个东西,这里的 AccessUri 仍然是“/”。这完全没有意义。
此外,我必须重新声明 Page_Load 方法这一事实也毫无意义。
是否有一种干净的方式来进行母版页继承,是否真的可行?
【问题讨论】:
-
我相信这可能是您在 Self 中进行的铸造。无论实际类型如何,您都将其转换为 BaseMaster。如果在页面加载中键入“this.accessUri”会发生什么?
标签: c# asp.net inheritance webforms master-pages