【问题标题】:C# ASP.NET MasterPage nested inheritance is evilC# ASP.NET MasterPage 嵌套继承是邪恶的
【发布时间】: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


【解决方案1】:

问题在于继承像

这样的母版页
BaseManagementMaster : BaseMaster

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

【讨论】:

  • 我不同意(很抱歉我在周末没有看到这个),因为我在我的项目中使用了继承的母版页。我也使用继承的页面类。你可以继承一个基类而不是你知道的基页。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
  • 2012-02-09
  • 2011-01-02
  • 2013-05-04
  • 1970-01-01
  • 2011-11-24
  • 2011-04-28
相关资源
最近更新 更多