Производный класс System.Web.Ui.Page, который может расширять события страницы? - PullRequest
0 голосов
/ 30 июня 2011

Я создал класс BasePage, который наследуется от System.Web.Ui.Page.В этом базовом классе у меня есть свойство bool, которое проверяет, безопасна ли страница.Первоначально я поместил код в событие PreInit (базового класса), но, подумав об этом, мои производные страницы не смогут установить значение bool до PreInit.Затем я подумал об установке значения в PreInit страниц с проверкой и проверке этого значения в PageInit базового класса, но что, если мне нужно использовать PreInit на производной странице?

Я подумал об использовании частичных методов, но я не думаю, что смогу это сделать, потому что события страницы не являются частичными в System.Web.Ui.Page, верно?

Кстати, мой класс BasePage - абстрактный класс.

Это то, что у меня сейчас (я не проверял это, но предполагал, что это может работать):

public abstract partial class BasePage: System.Web.UI.Page
{
   public bool IsSecure { get; set; }

   protected void Page_Init(object sender, EventArgs e)
        {
            if (!IsSecure) return;
            if (PageMaster == null)
                return;
            if (!PageMaster.IsUserLoggedIn)
            {
                HttpContext.Current.Response.Redirect("~/WebForms/LogIn.aspx");
            }
        }  
}


public partial class _Default : BasePage
{
   protected void Page_PreInit(object sender, EventArgs e)
   {
     IsSecure = true;
   }

}

Ответы [ 4 ]

2 голосов
/ 30 июня 2011

Лучшим решением может быть переопределение метода OnInit в вашем базовом классе. Теперь вы по-прежнему можете обрабатывать событие init на своих страницах, при этом безопасная проверка выполняется до возникновения события.

так:

public abstract partial class BasePage: System.Web.UI.Page
{
    public bool IsSecure { get; set; }

    protected override void OnInit(EventArgs e)
    {
        if (!IsSecure) return;
        if (PageMaster == null)
            return;
        if (!PageMaster.IsUserLoggedIn)
        {
            HttpContext.Current.Response.Redirect("~/WebForms/LogIn.aspx");
        }

        base.OnInit(e)
    }  
}

public partial class _Default : BasePage
{   
   protected void Page_PreInit(object sender, EventArgs e)
   {
      IsSecure = true;
   }

}
1 голос
/ 30 июня 2011

Я предлагаю вам сделать свойство IsSecure абстрактным (и только для чтения) и сделать так, чтобы ваши производные страницы реализовали его.Логика, определяющая значение свойства, содержится в получателе свойства.

В BasePage:

protected abstract bool IsSecure { get; }

В _Default и т. Д .:

protected override bool IsSecure 
{
    get { // return true or false depending on some condition }
}
0 голосов
/ 30 июня 2011

Ваш код в порядке, если вы хотите иметь возможность расширять PageInit, просто переопределите и вызовите базу в производном классе.

public partial class _Default : BasePage
{
    protected override void Page_Init(object sender, EventArgs e)
    {
        base.Page_Init(sender, e);
        //more code here
    }
}
0 голосов
/ 30 июня 2011

Почему бы не установить IsSecure в Constructor, это так рано, как вы собираетесь получить?

Просто определите это как:

public _Default()
{
 IsSecure = true;
}
...