Почему темы и главные страницы не могут применяться динамически после события Page.PreInit? - PullRequest
2 голосов
/ 26 декабря 2009


1) Я предполагаю, что темы могут быть установлены программно только внутри обработчика события Page.PreInit по следующим причинам:

  • если бы мы установили тему в обработчике события Page.Init, то к этому времени ViewState уже будет отслеживаться, и, таким образом, любые данные, применяемые темой, будут отслеживаться и помечаться как грязные (что потребовало бы большой пропускной способности). )?

  • и если мы установим его после события Init, то темы также могут переопределять десериализованные данные ViewState, примененные к отдельным элементам управления?


Существуют ли другие причины, по которым темы нельзя устанавливать после Page.PreInit?


2) Кроме того, почему главные страницы нельзя применять после Page.PreInit?

1026 * спасибо *

Ответы [ 2 ]

3 голосов
/ 26 декабря 2009

Согласно этому:

http://odetocode.com/articles/450.aspx

Свойство MasterPageFile может только быть установленным в или перед 'Page_PreInit' событие.

Это исключение имеет смысл, потому что мы знаю, главная страница должна изменить иерархия управления страницей перед событие Init срабатывает

Статья также включает в себя этот пример:

using System;
using System.Web.UI;

public class BasePage : Page
{
   public BasePage()
   {
        this.PreInit += new EventHandler(BasePage_PreInit);
   }

    void BasePage_PreInit(object sender, EventArgs e)
    {
        MasterPageFile = "~/Master1.master";
    }
}

Или подход, который я использовал раньше:

protected override void OnPreInit(EventArgs e) 
    { 
        base.OnPreInit(e); 
        if (Request.QueryString["Master"] == "Simple") 
            MasterPageFile = "~/Masterpages/Simple.Master"; 
    } 
1 голос
/ 26 декабря 2009

Есть ли другие причины, по которым Темы не может быть установлен после Page.PreInit?

Да. Темы включают скины, которые могут указывать свойства для элементов управления. Эти свойства должны быть установлены во время события Init, поэтому нужная тема должна быть выбрана до этого.

Отслеживание ViewState может быть проблемой, но я думаю, что это незначительное по сравнению с вышеупомянутым.

Обратите внимание, что StyleSheetTheme (предпочтительнее, чем обычная тема, IMO) фактически устанавливается из переопределенного свойства на странице, а не путем установки значения самого свойства (если вы не задали его из HttpModule).

почему нельзя применить главные страницы после Page.PreInit?

Элементы управления определяют свои идентификаторы и различные другие характеристики и свойства в зависимости от их расположения в дереве элементов управления (включая такие элементы, как доступ к элементу управления формы и т. Д.). Мастер-страница действует как набор родительских элементов управления, поэтому элементы управления могут полностью инициализировать себя, пока эта родительская структура не будет создана. Инициализация происходит во время события Init, поэтому перед этим необходимо выбрать главную страницу.

...