1

我是 asp.net 的新手,想知道处理这个问题的正确方法。

当用户登录时,他们会被发送到仪表板。我的母版页中有一个用户控件,它自动将用户帐户加载到会话变量中(它是一个下拉列表,因此他们可以选择多个帐户)。

我的仪表板有以下代码

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"];
    }

}
}
4

2 回答 2

1

问题出在:母版页在用户控件之前加载。这意味着母版页中的 Page_Load 事件发生在用户控件中的 Page_Load 事件之前。因此,当您尝试阅读会话时,尚未填充会话。

一种解决方案是在 ASP.NET 生命周期中选择稍后的事件。我会选择 PreRender 事件,因为它发生在 Load 事件之后。换句话说,母版页中的 Page_PreRender 发生在用户控件中的 Page_Load 之后。

看看这张超详细的 ASP.NET 生命周期图。

于 2013-02-15T23:56:58.323 回答
0

您设置会话变量的最早点可能是罪魁祸首。在 Session_Start 的 Global.asax 文件中设置一个会话变量,以便您的会话从应用程序启动一直持续到您销毁它。像 Session["start"] = DateTime.Now;

于 2013-02-16T02:57:34.733 回答