Как загружать в порядке Мастер Мастер-›Вложенный Мастер-›Страница

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

Итак, прямо сейчас мне нужно, чтобы Master Master сначала загружал мои данные, затем загружал материал в Nested Master, а затем загружал материал в Page.

Когда у меня был только один уровень мастера, я устанавливал порядок загрузки следующим образом:

  1. Вложенный Мастер — Инициализация
  2. Страница - Загрузить

Теперь, когда у меня есть дополнительный уровень Мастера, как мне загрузить его в следующем порядке?

  1. Мастер Мастер - ?
  2. Вложенный Мастер - ?
  3. Страница - ?

Это проблема, потому что ASP.NET по какой-то причине сначала загружает самый внутренний уровень. Итак, скажем, предоставив ту же функцию, ASP.NET будет вызывать в порядке Page->Nested->Master вместо того, что имело бы смысл: Master->Nested->Page. Что, по моему личному мнению, полностью противоречит цели наличия системы эталонных страниц.


person Bill Software Engineer    schedule 14.06.2012    source источник


Ответы (1)


Короткий ответ: PreRender, однако звучит так, как будто вы могли бы извлечь выгоду из переноса некоторой логики наших мастер-страниц в бизнес-объекты/классы? Наличие разных мастер-страниц, зависящих друг от друга, вероятно, не лучшая идея. Если вам нужно, чтобы данные были доступны глобально - загрузите их в бизнес-классе и кэшируйте их после создания на любое время (если только для запроса используйте HttpContext.Items).

Если вам нужно придерживаться этой настройки, у вас также есть возможность вызова через иерархию мастер-страниц, чтобы ваш корневой мастер (верхний уровень) мог сделать параметры/данные доступными OnInit. Все остальное, что в этом нуждается, может затем вызвать - вот метод, который зацикливает все мастер-страницы в любой заданной иерархии страниц и возвращает первый экземпляр требуемого типа:

/// <summary>
/// Iterates the (potentially) nested masterpage structure, looking for the specified type.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="currentMaster">The current master.</param>
/// <returns>Masterpage cast to specified type or null if not found.</returns>
public static T GetMasterPageOfType<T>(MasterPage currentMaster) where T : MasterPage
{
    T typedRtn = null;
    while (currentMaster != null)
    {
        typedRtn = currentMaster as T;
        if (typedRtn != null)
        {
            return typedRtn; //End here
        }

        currentMaster = currentMaster.Master; //One level up for next iteration
    }

    return null;
}

Использовать:

Helpers.GetMasterPageOfType<GlobalMaster>(this.Master);
person user369142    schedule 14.06.2012
comment
Я пытаюсь использовать ваш пример кода, но this.Master имеет значение null в функции Page_Init. Любые идеи? - person Bill Software Engineer; 14.06.2012