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イベントの前に発生することを意味します。そのため、セッションを読み込もうとしているときは、セッションにまだデータが入力されていません。

1つの解決策は、ASP.NETライフサイクルの後半のイベントを選択することです。Loadイベントの後に発生するため、PreRenderイベントを選択します。つまり、マスターページの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 に答える