Как да заредите по ред Master Master-›Nested Master-›Page

Моята настройка изисква 2 нива на основна страница, защото зареждам данни в Master Master, които се споделят в приложението ми с различни вложени главни.

Така че точно сега имам нужда от Master Master, за да заредя първо данните си, след това да заредя неща в Nested Master, след това да заредя неща в Page.

Когато имах само едно ниво на майстор, настроих моя ред на зареждане така:

  1. Вложен Master - Init
  2. Страница - Зареждане

Сега, след като имам допълнително ниво на Master, как да зареждам в следния ред?

  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