0

我的高级项目是在 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

提前致谢!!

编辑:

我要感谢所有发布和评论的人!我从这个简短的讨论中学到了很多东西。您所有的答案都帮助我理解了!

4

3 回答 3

4

从您的评论中:

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

这是因为设置/返回的[]索引器。编译器不知道您存储了一个对象,因此您无法在没有强制转换的情况下直接访问属性:SessionobjectcUser

string name = ((cUser)Session["cStudent"]).getName();

这里有两件事可能出错:

  1. 如果Session["cStudent"]null,你会得到一个NullReferenceException
  2. 如果Session["cStudent"]不是真的 acUser你会得到一个InvalidCastException

您应该检查这些条件并在其中一个为真时做出适当的反应。

此外,正如其他人指出的那样,cUser需要将类标记为Serializable以便存储在Session状态中。

于 2013-02-12T19:26:46.643 回答
4

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

像这样向你的类添加一个属性:

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

        return (cStudent)Session["CurrentUser"];
    }
    set {
        Session["CurrentUser"] = value;
    }
}
于 2013-02-12T19:00:58.947 回答
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.FirstName、s2.LastName 访问 s2 的属性

于 2013-02-12T19:11:40.967 回答