У меня есть решение с несколькими различными 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, тоже имеет мало смысла.
Есть ли чистый способ сделать наследование главной страницы, возможно ли это вообще реально?