c#类处于会话状态?

时间:2013-02-12 18:51:23

标签: c# asp.net

我的高级项目是在ASP.NET / C#中构建预订系统。我的高级项目的一部分是拥有c#类(并且基本上使用了我在过去几年中学到的所有内容)。我试图做的一件事是在我实例化一个新的“用户”类后,我需要它在页面之间传播。我知道会话状态包含变量,所以我认为会话状态可以工作,我只需键入“Session [”blah“]。”并有权访问其成员。但我没有看到这种情况发生。我意识到会话状态是HTTP上下文,所以我怀疑它无论如何都会工作。但是,有没有其他方法可以实现我所需要的,而无需每次都实例化一个新的用户类?我知道它是一个网页...但我也尽力使其成为一个功能性的在线程序。

为了编码员的缘故,继续使用的代码片段:

    cDatabaseManager cDM = new cDatabaseManager();

    string forDBPass = Encryptdata(pass_txt.Text.ToString());
    string fullName = fname_txt.Text.ToString() + " " + lname_txt.Text.ToString();

    cDM.regStudent(email_txt.Text.ToString(), forDBPass, fullName, num_txt.Text.ToString(), carrier_ddl.SelectedValue.ToString(), this);

    //ADD - getting a cStudent
    cUser studentUser = new cStudent(fullName, forDBPass, email_txt.Text.ToString());

    //ADD - session states
    Session["cStudent"] = studentUser;

    //Session["cStudent"].      //session state will not work with what I am doing
    //ADD - transfer to campus diagram

提前致谢!!

编辑:

我要感谢所有发帖和评论的人!我从这个简短的讨论中学到了很多东西。你的所有答案都让我明白了!

3 个答案:

答案 0 :(得分:4)

会话将项目存储为对象。只要您的类继承自Object(它确实如此),您就可以将其存储在那里。快速警告,它使用序列化存储该对象,因此您的类必须是可序列化的。

向您的类添加属性,如下所示:

public cStudent CurrentStudent
{
    get {
        if(Session["CurrentUser"] == null)
            return null;

        return (cStudent)Session["CurrentUser"];
    }
    set {
        Session["CurrentUser"] = value;
    }
}

答案 1 :(得分:4)

来自你的评论:

  

问题是当我输入"Session["cStudent"]."时,我无法访问我的功能。示例:Session["cStudent"].getName()不提供我的功能。

这是因为[]的{​​{1}}索引器设置/返回Session。编译器不知道您存储了object对象,因此如果没有强制转换,您无法直接访问属性:

cUser

这里有两件事可能出错:

  1. 如果string name = ((cUser)Session["cStudent"]).getName(); Session["cStudent"],您将获得null
  2. 如果NullReferenceException不是Session["cStudent"],您将获得cUser
  3. 如果其中一个条件成立,您应检查这些条件并作出适当反应。

    此外,正如其他人所指出的那样,InvalidCastException类需要标记为cUser才能存储在Serializable州。

答案 2 :(得分:2)

从会话状态检索对象值时,将其强制转换为适当的类型。

[Serializable]    
public class student
    {
      public string FirstName { get; set; }
      public string LastName { get; set; }
    }

在第1页:

student s1 = new student();
s1.FirstName ="James";
s1.LastName = "Bond";
Session["blah"] = s1;

当您想要访问第2页中的Session [“blah”]时

student s2 = (Session["blah"] !=null ? (student)Session["blah"] : null);

现在您可以访问s2的属性s2.FirstName,s2.LastName