Производный класс System.Web.Ui.Page, который может расширять события страницы?

Я создал класс BasePage, который наследуется от System.Web.Ui.Page. В этом базовом классе у меня есть логическое свойство, которое проверяет, является ли страница защищенной или нет. Изначально я поместил код в событие 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;
   }

}

person DDiVita    schedule 30.06.2011    source источник
comment
Ваше мышление правильное. Я не понимаю, где вы столкнулись с проблемой. Можете ли вы сделать пример псевдокода?   -  person Bazzz    schedule 30.06.2011
comment
Что вы имеете в виду, когда говорите, защищена страница или нет? Авторизован ли пользователь для просмотра?   -  person Anders Fjeldstad    schedule 30.06.2011
comment
@Anders Fjeldstad - Да, это из соображений безопасности пользователей. У нас в этом есть особая потребность.   -  person DDiVita    schedule 30.06.2011
comment
@Bazzz - я столкнулся с проблемой, используя частичные методы, но я пытаюсь получить совет о том, как лучше всего установить мое логическое значение из производной страницы и всегда проверять его в базовом классе.   -  person DDiVita    schedule 30.06.2011
comment
В какой момент жизненного цикла страницы (какое событие) производная страница сможет установить свойство?   -  person Anders Fjeldstad    schedule 30.06.2011
comment
@Bazzz - Также с возможностью расширить событие PageInit, если мне нужно.   -  person DDiVita    schedule 30.06.2011
comment
@Anders Fjeldstad - я обновил вопрос с некоторым кодом.   -  person DDiVita    schedule 30.06.2011


Ответы (4)


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

so:

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;
   }

}
person Simon Halsey    schedule 30.06.2011

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

In BasePage:

protected abstract bool IsSecure { get; }

В _Default и т. д.:

protected override bool IsSecure 
{
    get { // return true or false depending on some condition }
}
person Anders Fjeldstad    schedule 30.06.2011

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

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

public _Default()
{
 IsSecure = true;
}
person Richard Friend    schedule 30.06.2011
comment
В этом нет ничего плохого, но мне не нравится видеть логику приложения, встроенную в конструктор. Конструкторы должны быть быстрыми и легкими. Было бы лучше включить проверку в события жизненного цикла страницы. - person Simon Halsey; 30.06.2011
comment
Только установите свойство, я думаю, что это довольно легко.. все равно проверяйте, где хотите. - person Richard Friend; 30.06.2011
comment
Я хотел избежать использования логики в конструкторе. Хотя я думал об этом. - person DDiVita; 30.06.2011

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

public partial class _Default : BasePage
{
    protected override void Page_Init(object sender, EventArgs e)
    {
        base.Page_Init(sender, e);
        //more code here
    }
}
person Bazzz    schedule 30.06.2011