在单个页面上记住状态时,使用隐藏字段总是优于会话吗?

时间:2014-05-13 14:42:15

标签: c# asp.net session webforms state

当你需要记住回发或回调的状态时,我会认为会话不应该被使用。

这样做的一个原因是,如果打开多个选项卡,这将导致问题,因为一个选项卡中的操作将导致会话变量被更改,因此它将影响其他选项卡。

例如,如果我需要在页面上保留一组对象,我可以通过会话这样做。

protected void Page_Load(object sender, EventArgs e)
{
   List<MyClass> myClassList = Session["MyClassList"] as List<MyClass>;

   if(myClassLIst == null)
       myClassList = new List<MyClass>


    //Do something with collection
}

protected void AddButton_Click(object sender, EventArgs e)
{
  List<MyClass> myClassList = (List<MyClass>)Session["MyClassList"]

  myClassList.Add(new MyClass{ Name = NameTextBox.Text});

  Session["MyClassList"] = myClassList;
}

然而,由于上述原因,我不知道为什么我不能使用隐藏字段处理这个问题(Viewstate是另一种选择),如下所示。

protected void Page_Load(object sender, EventArgs e)
{
   //HiddenField.Value will store json data as a string

   List<MyClass> myClassList = JsonConvert.DeserializeObject
   <List<MyClass>>(HiddenField.Value);

   //Do something with collection
}

protected void AddButton_Click(object sender, EventArgs e)
{
  List<MyClass> myClassList = JsonConvert.DeserializeObject
  <List<MyClass>>(HiddenField.Value);

  myClassList.Add(new MyClass{ Name = NameTextBox.Text});

  HiddenField.Value = JsonConvert.SerializeObject(myClassList));
}

这里我将集合存储在Json的隐藏字段中,并使用Json.net对其进行序列化/反序列化。这解决了标签的问题,因为每个页面现在负责它的状态。

我的问题是我是否正确地断定会话只应在记住多个页面的数据时使用?并且使用隐藏的字段总是更好?我看到很多例子,人们在一个页面中使用会话来记住状态,所以我可能会遗漏一些东西。

2 个答案:

答案 0 :(得分:4)

差不多,是的,页面特定数据不应存储在Session中,因为如果打开多个选项卡/窗口,这可能会导致问题。

直接使用ViewState是一个不错的选择。或者,如果您需要从客户端访问其中的值,则使用HiddenFields可以正常工作。这确实是使用ViewState和HiddenFields之间的决策点。

答案 1 :(得分:4)

如果数据特定于单个页面,请使用ViewState。如果需要与客户端代码共享数据,请移至HiddenField。如果数据需要在多个页面请求中保留,请转到Session

Session中存储数据的一个潜在问题是它可能在多个浏览器窗口之间共享。如果您的用户打开一个新窗口,您可能会在共享同一会话的窗口之间发生冲突。这很好,甚至可能更好,如果数据用于维护一组权限,但如果数据包含特定页面的选择,那将破坏您的应用程序。