我已经从教程http://www.c-sharpcorner.com/uploadfile/9505ae/session-variables-as-objects/
创建了会话变量作为对象我已从登录页面LoginUser.aspx
中提供了会话的值。
我试图在基页中检查会话值是否为空。当我从登录页面登录并重定向到另一个页面时,会在基页中检查会话值。 Base页面中的会话值始终为NULL。我无法在基页类中检索从LoginUser.aspx
设置的会话值。
public class C_UserSession
{
#region Variables
private const string mySessionName = "_MyUserInfo_"; //Our session name
private string username;
private string role;
private string name;
#endregion
#region constructor
public C_UserSession()
{
}
#endregion
#region Public Methods
public string UserName
{
get { return this.username; }
set { this.username = value; Save(); }
}
public string Role
{
get { return this.role; }
set { this.role = value; Save(); }
}
public string Name
{
get { return this.name; }
set { this.name = value; Save(); }
}
#endregion
#region Private Methods
private void CheckExisting()
{
if (HttpContext.Current.Session[mySessionName] == null)
{
//Save this instance to the session
HttpContext.Current.Session[mySessionName] = this;
UserName = string.Empty;
Role = string.Empty;
Name = string.Empty;
}
else
{
//Initialize our object based on existing session
C_UserSession oInfo = (C_UserSession)HttpContext.Current.Session[mySessionName];
this.UserName = oInfo.UserName;
this.Name = oInfo.Name;
this.Role = oInfo.Role;
oInfo = null;
}
}
private void Save()
{
//Save our object to the session
HttpContext.Current.Session[mySessionName] = this;
}
#endregion
}
逻辑后面的登录页面代码
public partial class LoginUser : System.Web.UI.Page
{
C_UserSession usersession;
protected void Page_Load(object sender, EventArgs e)
{
Session.Clear();
Session.Abandon();
usersession = new C_UserSession();
}
protected void btnSignIn_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt = new C_User().Get_LoginUser(inputUserName.Value, inputPwd.Value);
if (dt == null || dt.Rows.Count == 0)
{
Response.Redirect("LoginUser.aspx", false);
return;
}
DataRow dr = dt.Rows[0];
usersession.UserName = dr["USERNAME"].ToString();
usersession.Name = dr["NAME"].ToString();
usersession.Role = dr["ROLE"].ToString();
Int16 userRole = Convert.ToInt16(usersession.Role);
Dictionary<int, string> _redirects = new Dictionary<int, string>
{
{ 1, "product.aspx"}, {2, "shift.aspx" }
};
Response.Redirect(_redirects[userRole], false);
}
}
背后的基页代码
public class BasePage : System.Web.UI.Page
{
C_UserSession usersession;
public BasePage() {
usersession = new C_UserSession();
}
protected override void OnInit(EventArgs e)
{
try
{
if ( string.IsNullOrEmpty(usersession.UserName) || string.IsNullOrEmpty(usersession.Role))
{
Response.Redirect("LoginUser.aspx");
Context.ApplicationInstance.CompleteRequest();
}
}
catch (Exception ex)
{
throw;
}
}
}
产品页面继承基页
public partial class product : BasePage
{
// code blocks
}
当我打开product.aspx
页面时,它会将我重定向到LoginUser.aspx
,因为会话值为空。但是在提供有效的用户名和密码之后,我也无法进入相应的页面。我无法从基页检查会话值。我无法理解这样做的正确方法是什么。请帮忙。谢谢!!!
答案 0 :(得分:2)
这是问题所在。在您的BasePage
中,您有以下代码:
public class BasePage : System.Web.UI.Page
{
C_UserSession usersession;
public BasePage()
{
usersession = new C_UserSession();
}
protected override void OnInit(EventArgs e)
{
try
{
if (string.IsNullOrEmpty(usersession.UserName) || string.IsNullOrEmpty(usersession.Role))
{
}
}
}
}
但是在课程usersession.Userame
之外会因为您刚刚在构造函数中创建它而为空。
您应该做的是检查会话是否存在,如果不存在,则执行重定向:
public class BasePage : System.Web.UI.Page
{
C_UserSession usersession;
public BasePage()
{
usersession = (C_UserSession)HttpContext.Current.Session[mySessionName];
}
protected override void OnInit(EventArgs e)
{
try
{
if (usersession == null)
{
Response.Redirect("LoginUser.aspx");
Context.ApplicationInstance.CompleteRequest();
}
}
}
}
现在您的代码中可能还有其他问题,但这是您问题的答案。
请帮个忙:如果您使用C#进行编码,请按照C# coding conventions进行操作。停止使用C_UserSession
之类的名称,并在没有下划线的情况下调用它。不要打电话给你的班级product
,而是将其称为Product
(Pascal Notation),或者更好地称之为ProductPage
。花一些时间研究你的代码并进行清理。
答案 1 :(得分:0)
我不认为您正在初始化您的用户对象。您的类上有一个CheckExisting()私有方法,如果它在那里,它似乎会从会话中重新保留该类,但是从不调用它。如果你不在课堂上打电话,那么它就不会填写这些属性,它们将永远是默认属性。