C# ASP.NET MasterPage 嵌套继承是邪恶的
我有一个包含相当多不同的 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 方法这一事实也没有什么意义。
是否有一种干净的方法来进行母版页继承,这实际上是可能的吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
问题在于像
这样继承母版页是错误的,正确的方法应该是只声明母版页,然后在页面级别而不是母版级别进行抽象。
the problem was in inheriting masterpages like
this is wrong, the correct way to do this should be to just declare MasterPages, and then have abstractions at Page level, not Master level.