将母版页对象传递到嵌套的母版页

Pass down master page object to nested master page

抱歉,如果这太琐碎了,但我似乎 运行 遇到无法从嵌套母版页访问对象的问题。

我无法将 User 对象从我的主要母版传递到我的嵌套母版。当它到达我的嵌套母版页时,它为空。我不记得让母版页说话有问题,但在这种情况下它只是不想工作。

如此设置,部分代码省略:

public partial class RWCMSMain : System.Web.UI.MasterPage
{
    public Business.BusinessEntities.User LoggedOnUser { get;  set; }

    protected void Page_Load(object sender, EventArgs e)
    {
       //Get the user
       var loggedOnUser = userRepo.GetUser(securityToken);

       //Now set the property
       this.LoggedOnUser = loggedOnUser;
    }
}

如果我要从继承主母版的内容页面访问它,一切都很好,但我的想法是拥有一个包含侧边栏的母版页。

现在我的side.master继承自主要主人:

public partial class RWCMSSide : System.Web.UI.MasterPage
{
   //Create property for nested master
    public Business.BusinessEntities.User LoggedOnUser { get; set; }

    protected void Page_Load(object sender, EventArgs e)
    {
       //Assign main masters user to the new property
       //Master.LoggedOnUser is always null
       this.LoggedOnUser = Master.LoggedOnUser;
    }
}

您可能会争辩说我可以在嵌套的母版页上重新创建用户,但是当它可以作为一个完成时,这将对数据库产生两次点击。

调试主master时用户存在,就是不传下去

如有指点,将不胜感激!

此致,

问题

Master 的 Load 被执行 after Child 的 Load:

  • ...
  • Master page Init event.
  • Content page Init event.
  • Content page Load event.
  • Master page Load event.
  • Master page controls Load event.
  • ...

这就是 属性 为空的原因。

解决方案

1. 您可以在 Init 事件中设置它 - protected void Page_Load(object sender, EventArgs e)... 如果它不依赖于正在加载的页面(因为它可能是).

2. 或者你可以把 属性 变成懒惰的 属性(如果不是,则不需要实际的 Lazy<T> (它可能不应该)用于多线程代码):

public partial class RWCMSMain : System.Web.UI.MasterPage
{
    private Business.BusinessEntities.User m_LoggedOnUse;

    public Business.BusinessEntities.User LoggedOnUser 
    { 
         get
         {
              if (this.m_LoggedOnUse == null)
                  this.m_LoggedOnUse = userRepo.GetUser(securityToken);

              return this.m_LoggedOnUse;
         } 
    }

    protected void Page_Load(object sender, EventArgs e)
    {
    }
}