ASP.NET UserControl变量生存期问题


  • 获得Site.Master(主页(
  • 获取Default.aspx(第页(
  • Default.aspx中,放置了一个UserControl LoginUserControl.ascx

现在我的问题是:

LoginUserControl中,我检查Login是否正确。如果是,则我将Default.aspx上的属性IsLoggedIn设置为true:

    //Inside LoginUserControl.ascx
    if (/*Login is Ok*/)
    {
         ((Default)Page).IsLoggedIn = true;
    }

所以,现在我需要主页Site.Master中的这些信息我必须知道用户是否已登录。。我这样做:

    //Inside Site.Master
    protected void Page_Load(object sender, EventArgs e)
    {
        if (((Default)Page).IsLoggedIn)
        {
             //Do Something
        } 
    }

但是它总是错误的!为什么?我想我设置了IsLoggedIn=true?!为什么它是假的?这是一个生命周期问题吗?我必须做的是,它能起作用:(

您应该将属性IsLogged on添加到页面的视图状态中。

public bool IsLoggedOn { 
    get { return ViewState["IsLoggedOn"]==null?false:Convert.ToBoolean(ViewState["IsLoggedOn"]); }
    set { ViewState["IsLoggedOn"] = value; }
}

或者,如果该属性在多个页面上使用,则应将其添加到会话(用会话替换ViewState(

这很可能是页面生命周期问题。站点中的Page_Load.Master在您的用户控件中先于Page_Load运行。您需要做的是找到适当的页面和控件事件,以便在其中应用代码
此页面对页面/控件/用户控件事件生命周期进行了完整的细分,应该会有所帮助(向下滚动到合并的事件(
我认为您的最佳选择是在用户控制Page_it事件期间设置IsLoggedIn属性,或者在母版页的Page_Prender事件期间检索并对其执行操作。

最新更新