C# usercontrol中的会话变量在刷新之前不加载
我是asp.net新手,想知道如何正确处理这个问题 当用户登录时,会将其发送到仪表板。我在母版页中有一个usercontrol,它会自动将用户帐户加载到会话变量中(这是一个dropdownlist,因此他们可以选择多个帐户) 我的仪表板有下面的代码C# usercontrol中的会话变量在刷新之前不加载,c#,asp.net,C#,Asp.net,我是asp.net新手,想知道如何正确处理这个问题 当用户登录时,会将其发送到仪表板。我在母版页中有一个usercontrol,它会自动将用户帐户加载到会话变量中(这是一个dropdownlist,因此他们可以选择多个帐户) 我的仪表板有下面的代码 if (Session["SiteID"] != null) { SiteID = int.Parse(Session["SiteID"].ToString()); PopulateAccountData(); Populat
if (Session["SiteID"] != null)
{
SiteID = int.Parse(Session["SiteID"].ToString());
PopulateAccountData();
PopulateAccountInformation2();
PopulateSiteNodes();
PopulateSiteMap();
}
else
{
LabelSiteName.Text = "No Site Selected";
}
首次加载时,页面始终显示未选择任何站点。如果我点击刷新,它将正确填充页面
如何让它在首次加载时使用会话变量
更新-这是我的用户控制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
namespace WebApp
{
public partial class SitePicker : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
DataSet ClientList;
// if never loaded, go get it and stash it
if (Session["dsClientList"] == null)
{
ClientList = GetClientListFromDB();
Session["dsClientList"] = ClientList;
Session["ClientID"] = (int)ClientList.Tables[0].Rows[0]["ClientID"];
}
else
{
ClientList = (DataSet)Session["dsClientList"];
}
if (DropDownListClient.Items.Count == 0)
{
DropDownListClient.DataSource = ClientList;
DropDownListClient.DataValueField = "ClientID";
DropDownListClient.DataTextField = "ClientName";
DropDownListClient.DataBind();
}
//ClientButton.Text = DropDownListClient.SelectedItem.Text;
DataSet SiteList;
if (Session["dsSiteList"] == null)
{
SiteList = GetSiteListFromDB();
Session["dsSiteList"] = SiteList;
Session["SiteID"] = (int)SiteList.Tables[0].Rows[0]["SiteID"];
}
else
SiteList = (DataSet)Session["dsSiteList"];
if (DropDownListSite.Items.Count == 0)
{
// SiteButton.Text = DropDownListSite.SelectedItem.Text;
DropDownListSite.DataSource = SiteList;
DropDownListSite.DataValueField = "SiteID";
DropDownListSite.DataTextField = "SiteName";
DropDownListSite.DataBind();
DropDownListSite.SelectedValue = Session["SiteID"].ToString();
}
}
protected void LoadSite()
{
// Response.Redirect(Request.RawUrl);
// Response.Redirect(".");
Response.Redirect(Request.RawUrl, true);
//Server.Transfer(".");
}
protected void ClientButton_Click(object sender, EventArgs e)
{
//DropDownListClient.Visible = true;
//ClientButton.Visible = false;
}
DataSet GetClientListFromDB()
{
DataAccess da = new DataAccess();
da.AddParameter("portaluserid", Page.User.Identity.Name, DataAccess.SQLDataType.SQLString, 256);
DataSet ClientList = da.runSPDataSet("Portal_SitePickerClientList");
return ClientList;
}
protected void DropDownListClient_SelectedIndexChanged(object sender, EventArgs e)
{
//ClientButton.Enabled = true;
//DropDownListClient.Visible = false;
int ClientID = int.Parse(DropDownListClient.SelectedItem.Value);
ClientButton.Text = DropDownListClient.SelectedItem.Text;
//ClientButton.Visible = true;
Session["ClientID"] = ClientID;
Session["ClientName"] = DropDownListClient.SelectedItem.Text;
PopulateSiteList();
}
DataSet GetSiteListFromDB()
{
DataAccess da = new DataAccess();
da.AddParameter("portaluserid", Page.User.Identity.Name, DataAccess.SQLDataType.SQLString, 256);
da.AddParameter("ClientID", Session["ClientID"], DataAccess.SQLDataType.SQLInteger, 4);
DataSet SiteList = da.runSPDataSet("Portal_SitePickerSiteList");
return SiteList;
}
void PopulateSiteList()
{
// DataSet SiteList;
//if (Session["dsSiteList"] != null)
// SiteList = (DataSet)Session["dsSiteList"];
//else
// SiteList = GetSiteListFromDB();
//DropDownListSite.DataSource = SiteList;
//DropDownListSite.DataValueField = "SiteID";
//DropDownListSite.DataTextField = "SiteName";
//DropDownListSite.DataBind();
//DropDownListSite.Visible = true;
//SiteButton.Visible = false;
//DropDownListSite.SelectedIndex = 1;
}
protected void DropDownListSite_SelectedIndexChanged(object sender, EventArgs e)
{
//DropDownListSite.Visible = false;
//SiteButton.Visible = true;
int SiteID = int.Parse(DropDownListSite.SelectedItem.Value);
SiteButton.Text = DropDownListSite.SelectedItem.Text;
Session["SiteID"] = SiteID;
Session["SiteName"] = DropDownListSite.SelectedItem.Text;
LoadSite();
}
protected void SiteButton_Click(object sender, EventArgs e)
{
//if (DropDownListSite.Visible == false)
//PopulateSiteList();
//SiteButton.Visible = false;
if (Session["SiteID"] != null)
{
int SiteID = (int)Session["SiteID"];
DropDownListSite.SelectedValue = SiteID.ToString();
}
}
protected void GetClientAndSiteFromSiteID()
{
DataAccess da = new DataAccess();
da.AddParameter("SiteID", (int)Session["SiteID"], DataAccess.SQLDataType.SQLInteger, 4);
DataSet ds = da.runSPDataSet("NavigationGetClientSiteFromSiteID");
Session["ClientID"] = (int)ds.Tables[0].Rows[0]["ClientID"];
Session["ClientName"] = ds.Tables[0].Rows[0]["ClientName"];
Session["SiteName"] = ds.Tables[0].Rows[0]["SiteName"];
}
}
}
问题是:母版页在用户控件之前加载。这意味着母版页中的页面加载事件发生在用户控件中的页面加载事件之前。因此,当您尝试读取会话时,会话尚未填充 一种解决方案是在ASP.NET生命周期中选择稍后的事件。我会选择PreRender事件,因为它发生在加载事件之后。换句话说,母版页中的页面预呈现发生在用户控件中的页面加载之后
看看ASP.NET生命周期的超级详细地图。问题是:母版页在用户控件之前加载。这意味着母版页中的页面加载事件发生在用户控件中的页面加载事件之前。因此,当您尝试读取会话时,会话尚未填充 一种解决方案是在ASP.NET生命周期中选择稍后的事件。我会选择PreRender事件,因为它发生在加载事件之后。换句话说,母版页中的页面预呈现发生在用户控件中的页面加载之后
看看ASP.NET生命周期的超级详细地图。最早设置会话变量的地方可能就是罪魁祸首。在session_Start中的Global.asax文件中设置一个session变量,这样您的会话将从应用程序启动一直持续到您销毁它为止。类似于Session[“start”]=DateTime.Now 设置会话变量的最早时间点可能就是罪魁祸首。在session_Start中的Global.asax文件中设置一个session变量,这样您的会话将从应用程序启动一直持续到您销毁它为止。类似于Session[“start”]=DateTime.Now 在控件的生命周期中,您将在何处加载会话?换句话说,哪个函数(Page_Load、Page_Init…等等)?您需要钩住代码运行时引发的事件,在C#WinForms中,它是Form_Loaded事件,尽管我不确定是否适用于ASP.NET。一旦您找到了它,您只需调用刷新时调用的代码。对不起,我帮不了你了@加载页面上的SystemDown。发布加载会话的代码。此外,仪表板代码位于哪个功能中?仪表板代码位于pageload中。我用我的usercontrol进行了更新。在该控件的生命周期中,您将在何处加载会话?换句话说,哪个函数(Page_Load、Page_Init…等等)?您需要钩住代码运行时引发的事件,在C#WinForms中,它是Form_Loaded事件,尽管我不确定是否适用于ASP.NET。一旦您找到了它,您只需调用刷新时调用的代码。对不起,我帮不了你了@加载页面上的SystemDown。发布加载会话的代码。此外,仪表板代码位于哪个功能中?仪表板代码位于pageload中。我用我的usercontrol更新了。谢谢。我把它改为预渲染,效果很好。谢谢你的详细地图。我从中学到了很多。谢谢。我把它改为预渲染,效果很好。谢谢你的详细地图。我从中学到了很多。