我正在创建一个网站,我需要维护一个登录用户的会话。有不同的页面,因此必须维护每个页面的会话。我在主页上的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();
}
}
答案 0 :(得分:5)
您遇到的问题是,当您检查PostBack时,在第一个if
部分中,您正在清除Session变量,然后检查它们是否为空。这里没有意义。它们将始终为空,您的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
}
}
同样,您尝试实现的内容已作为LoginView
组件提供。看看这些Web Forms tutorials on ASP.NET
答案 1 :(得分:1)
根据您的问题,我不太清楚您是否了解会话行为在ASP.NET中的工作原理。您不必为了在同一网站的页面之间保持会话而做任何事情。此外,您提供的代码段永远不会执行任何操作:
// 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"];
}