C # ASP.NET MasterPage вложенное наследование это зло - PullRequest
2 голосов
/ 09 октября 2010

У меня есть решение с несколькими различными 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 голосов
/ 11 октября 2010

проблема была в наследовании шедевров типа

BaseManagementMaster : BaseMaster

это неправильно, правильный способ сделать это - просто объявить MasterPages, а затем иметь абстракции на уровне страницы, а не на уровне Master.

...