1

ログインしたユーザーのセッションを維持する必要がある Web サイトを作成しています。さまざまなページがあるため、ページごとにセッションを維持する必要があります。ホームページのEnterボタンのクリックイベントでセッション変数に値を渡しています。コードは初めて正常に動作しますが、ユーザーが別のページからホームページにリダイレクトすると、セッションが null になります。すべてのページの値を保持するためにセッションを作成する場所がわかりません。

これが私のコードです:

 protected void Page_Load(object sender, EventArgs e)
{
    //Session["UserName"] = null;
    //Session["UserRoles"] = null;
    if (!Page.IsPostBack) //if page is not postback then here
    {
        Session["UserName"] = null;
        Session["UserRoles"] = null;
        if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "Admin")
        {
            divLoggedInMember.Visible = true;
            lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"] + "(Admin)";
        }
        else if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "member")
        {
            divLoggedInMember.Visible = true;
            lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"];
        }
    }

    else //if page postback then here
    {
        if (Session["UserRoles"] != null)
        {
            if ((String)Session["UserRoles"]=="Admin")
            {
                divLoggedInMember.Visible = true;
                lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"] + "(Admin)";
            }
            else
            {
                divLoggedInMember.Visible = true;
                lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"];
            }
        }
    }


}


 protected void btnenter_Click(object sender, ImageClickEventArgs e)
    {
        try
        {
            Session["UserName"] = null;
            Session["UserRoles"] = null;
            DataTable dt = new DataTable();
            dt=getUserInfo(txtUserId.Text.Trim(),txtPassword.Text.Trim());

            if (dt.Rows.Count == 0)
            {
                Response.Write("<script> alert('User Not Exist')</script>");
            }
            else
            {
                strUserName = dt.Rows[0]["User_Name"].ToString();
               // strUserName = txtUserId.Text.Trim(); 
                struserRoles = dt.Rows[0]["USER_ROLE"].ToString();
                Session["UserName"] = (String)strUserName;
                Session["UserRoles"] = (String)struserRoles;

                if (Session["UserRoles"] != null && (String)Session["UserRoles"]=="Admin")
                {
                    divLoggedInMember.Visible = true;
                    lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"] + "(Admin)";
                }
                else if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "Member")
                {
                    divLoggedInMember.Visible = true;
                    lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"];
                }
                Response.Redirect("MemberPage.aspx", false);
            }
        }
        catch (Exception ex)
        {
            ex.Message.ToString();
        }
    }
4

2 に答える 2

5

ifあなたが抱えている問題は、PostBack をチェックするときの最初の部分で、Session 変数をクリアしてから null をチェックしていることです。ここには意味がありません。それらは常に null であり、あなたのifandelse ifは決して発生しません。戦略と達成したいことを再考してください。

さて、あなたがやろうとしていることに関する私のコメント... まず第一に、この方法でセッションを使用することは、Classic ASP で行うようなものです。ASP.NET には、これを行うためのはるかに優れたメカニズムがあります。代わりに、ユーザーを認証して追跡するために と をMembershipProvider活用する必要があります。RoleProviderセッション変数からユーザー名を読み取る代わりに、通常はPage.User.Identity.Nameユーザーの ID またはユーザー名を取得するために使用します。これに加えて、またはクラスRoles.IsUserInRole()内の他の静的メソッドを使用できます。Roles

第二に、変数名を何度も繰り返しています。つまり、あまりにも多くの場所で同じものを指すハードコードされた文字列を使用しています。あなたのメンテナンスはめちゃくちゃになるでしょう。まだ開発段階の初期段階ですが、FormsAuthenticationASP.NET に上記のすべてのタスクを処理させるように切り替えてください。

更新: ASP.NET には、ログインとセキュリティに関する一連のコンポーネントが含まれています。これらの 1 つはLoginView、さまざまな役割に基づいてさまざまなビューを指定できるようにするものです。このコントロールを使用すると、実行中のチェックに煩わされる必要がなくなります。

あなたが行うチェックは Page_Load で問題ありませんが、これを最適化する必要があります。定期的なチェックが必要な場合は、気にしないでくださいif (IsPostBack) ... else ...。このチェックは外で行います。例えば:

protected void Page_Load(object sender, EventArgs e)
{
    if (Session["UserRoles"] != null && Session["UserRoles"] == "Admin")
    {
        // Show Admin section
        // Hide Non-admin section
    }
    else
    {
        // Hide Admin section
        // Show non-admin section
    }

    if (!IsPostBack)
    {
        // Do Postback logic here
    }
}

繰り返しますが、達成しようとしているものは、LoginViewコンポーネントとして既に利用可能です。ASP.NET の Web フォーム チュートリアルをご覧ください

于 2013-03-02T15:49:53.170 に答える
1

あなたの質問に基づいて、セッションの動作が ASP.NET でどのように機能するかを理解しているかどうかはよくわかりません。同じ Web サイト内のページ間でセッションを維持するために何もする必要はありません。さらに、提供されたコード スニペットは何もしません。

       // You set theses two session vars to null, but then 
       // immediately check for contents??
       Session["UserName"] = null;
        Session["UserRoles"] = null;

        // Neither of these if statements will ever evaluate to true,
        // because you just set them to null above..
        if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "Admin")
        {
            divLoggedInMember.Visible = true;
            lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"] + "(Admin)";
        }
        else if (Session["UserRoles"] != null && (String)Session["UserRoles"] == "member")
        {
            divLoggedInMember.Visible = true;
            lblLoggedinUser.Text = "Welcome" + " " + Session["UserName"];
        }
于 2013-03-02T15:45:29.683 に答える