ASP.NET,会话维护页面加载和回发

use*_*933 1 asp.net session pageload

我正在建立一个网站,我需要维护一个登录用户的会话.有不同的页面,因此必须维护每个页面的会话.我在主页上的enter按钮的click事件中传递我的会话变量中的值.代码第一次正常工作,但是当用户从另一个页面重定向到主页时,会话变为空.我很困惑在哪里进行会话以保留所有页面的值.

这是我的代码:

 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();
        }
    }
Run Code Online (Sandbox Code Playgroud)

Hus*_*vic 5

您遇到的问题是,在if检查PostBack 的第一部分中,您正在清除Session变量,然后检查它们是否为null.这里没有意义.他们将永远是零,你的if和else if永远不会发生.重新思考您的战略以及您想要实现的目标.

现在,我对你要做什么的评论......首先,以这种方式使用Session是你在Classic ASP中所做的一件事.使用ASP.NET,有更好的机制来实现这一点.相反,您应该利用MembershipProvider并RoleProvider验证您的用户并跟踪他们.您不会从会话变量中读取用户名,而是通常用于Page.User.Identity.Name检索用户的ID或用户名.除此之外,您还可以Roles.IsUserInRole()在Roles类中使用或使用其他一些静态方法.

第二件事,你重复你的变量名称太多次了.也就是说,您使用的硬编码字符串在太多地方指向同一个字符串.你的维护将变得一团糟.虽然您还处于开发阶段的早期阶段,但请切换FormsAuthentication到让ASP.NET为您处理上述所有任务.

更新:ASP.NET包含一组有关登录和安全性的组件.其中之一是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
    }
}
Run Code Online (Sandbox Code Playgroud)

同样,您要实现的目标已经作为LoginView组件提供.看看ASP.NET上的这些Web窗体教程