C#ASP.NET MasterPage嵌套继承是邪恶的

时间:2010-10-09 01:21:25

标签: c# asp.net inheritance webforms master-pages

我有一个解决方案,有很多不同的MasterPages / BasePages,它们都继承自其他地方。我的问题是我在BaseMaster中有一个虚拟字符串,它被BaseManagement覆盖,但是当我尝试访问这个字符串时,我总是得到基值

继承主人和页面的重点显然是避免在任何地方都有重复的代码。

也许这与我在每个主人都“需要”protected void Page_Load(object sender, EventArgs e)无关的事实有关


Base Classes

所以,这是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方法的事实也没有多大意义。

是否有一种干净的方式来进行母版页继承,它是否真的可行?

1 个答案:

答案 0 :(得分:0)

问题在于继承像

这样的主页
BaseManagementMaster : BaseMaster

这是错误的,这样做的正确方法应该是声明MasterPages,然后在Page级别而不是Master级别进行抽象。