检查在基页中的另一个cs文件中创建的会话变量的值

时间:2017-11-30 04:03:37

标签: c# asp.net session

我已经从教程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,因为会话值为空。但是在提供有效的用户名和密码之后,我也无法进入相应的页面。我无法从基页检查会话值。我无法理解这样做的正确方法是什么。请帮忙。谢谢!!!

2 个答案:

答案 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()私有方法,如果它在那里,它似乎会从会话中重新保留该类,但是从不调用它。如果你不在课堂上打电话,那么它就不会填写这些属性,它们将永远是默认属性。