如何按主页>嵌套主页>页面的顺序加载

本文关键字:主页 顺序 加载 嵌套 何按 | 更新日期: 2023-09-27 18:37:07

我的设置需要 2 级母版页,因为我正在主母版中加载数据,这些数据在我的应用程序中与不同的嵌套母版共享。

所以现在我需要Master Master先加载我的数据,然后在Nested Master中加载内容,然后在Page中加载内容。

当我只有一个级别的主节点时,我将加载顺序设置为:

  1. 嵌套主节点 - 初始化
  2. 页面 - 加载

现在我有了额外的大师级别,如何按以下顺序加载?

  1. 师傅师傅 - ?
  2. 嵌套主控 - ?
  3. 页-?

这是一个问题,因为 ASP.NET 由于某种原因首先加载最内层。 因此,假设给出相同的函数,ASP.NET 将按Page->Nested->Master的顺序调用,而不是有意义的顺序:Master->Nested->Page。 在我个人看来,这完全违背了拥有母版页系统的目的。

如何按主页>嵌套主页>页面的顺序加载

简短的回答是 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);