ASP.NET MVC维护对象Session

ASP.NET MVC maintain object Session

我有一个网站,用户需要做一些简单的第 1 步到第 4 步,所以我决定将所有数据保存到会话对象中,在第 2 步到第 4 步用户可以返回到上一步来检查表单(数据将被会话填充)

我的问题是。我们可以将新的 value/object 存储到会话中,同时保持以前的值吗??

Session["regis"] = student.firstname

// i want object_a value still remain in Session["regis"]
Session["regis"] = student.lastname

还是我应该做超过 1 个会话?

Session["Step1"] = student.firstname

Session["Step2"] = student.lastname

在您的情况下,当新值分配给具有相同键的会话对象时,您将丢失以前的值,即 regis 因此您需要使用第二个选项。

您可以使用舞台 create/access 会话对象,例如

在会话中设置值

Session["Step" + stepIndex] = student.firstname;

从会话中获取值

string str = Session["Step" + stepIndex].ToString();

是。 您可以在 不同的键 下的会话中存储多个值,就像在您的 second 示例(请注意,这是同一个会话,只是一个不同的密钥)。但是,这不会执行您想要的操作:

Session["regis"] = student.firstname

// This will overwrite the first value
Session["regis"] = student.lastname

您也可以考虑将整个视图模型存储在一个键下。

不过,在会话中存储内容时一定要小心。很容易引发不良行为。例如——应用程序池可能会过期,丢失会话数据;如果您 运行 在负载平衡环境中,您的用户在访问不同的应用程序服务器时可能会丢失他们的会话;如果用户 运行 多个选项卡,则在一个选项卡的请求中分配的会话变量可能会干扰另一个选项卡中应用程序的行为,等等。

考虑改用 cookie 或隐藏字段。如果您必须使用会话变量,最好至少生成动态键并在查询字符串中将这些键从一个页面传递到另一个页面,以确保例如使用多个选项卡不会导致键冲突。

另一个选项是在会话中存储对象。 (假设学生是学生 class 的实例)

private Student StudentSession
{
    get{ return (Student)Session["regis"]; }
    set{ Session["regis"] = value; }
}

用法,

StudentSession = new Student();

StudentSession.Name = "Scott";
StudentSession.Surname = "Foo";

稍后您可以在另一页上分配其他变量。

StudentSession.Age = 12;