我有一个解决方案,有很多不同的MasterPages / BasePages,它们都继承自其他地方。我的问题是我在BaseMaster中有一个虚拟字符串,它被BaseManagement覆盖,但是当我尝试访问这个字符串时,我总是得到基值
继承主人和页面的重点显然是避免在任何地方都有重复的代码。
也许这与我在每个主人都“需要”protected void Page_Load(object sender, EventArgs e)
无关的事实有关
所以,这是Base.Master.cs的一个片段
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方法的事实也没有多大意义。
是否有一种干净的方式来进行母版页继承,它是否真的可行?
答案 0 :(得分:0)
问题在于继承像
这样的主页BaseManagementMaster : BaseMaster
这是错误的,这样做的正确方法应该是声明MasterPages,然后在Page级别而不是Master级别进行抽象。