C# 当记住单个页面上的状态时,使用隐藏字段是否总是比会话更好?

C# 当记住单个页面上的状态时,使用隐藏字段是否总是比会话更好?,c#,asp.net,session,webforms,state,C#,Asp.net,Session,Webforms,State,当您需要记住回发或回调的状态时,我会认为不应该使用会话 原因之一是,如果打开多个选项卡,这将导致问题,因为一个选项卡中的操作将导致会话变量被更改,从而影响其他选项卡 例如,如果我需要在页面上持久化一组对象,我可以像这样通过会话来实现 protected void Page_Load(object sender, EventArgs e) { List<MyClass> myClassList = Session["MyClassList"] as List<MyClass

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

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

例如,如果我需要在页面上持久化一组对象,我可以像这样通过会话来实现

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;
}
受保护的无效页面加载(对象发送方,事件参数e)
{
将myClassList=会话[“myClassList”]列为列表;
如果(myClassLIst==null)
myClassList=新列表
//收集一些东西
}
受保护的void AddButton\u单击(对象发送者,事件参数e)
{
列表myClassList=(列表)会话[“myClassList”]
添加(新的MyClass{Name=NameTextBox.Text});
会话[“MyClassList”]=MyClassList;
}
然而,由于上述原因,我看不出有任何理由不使用下面的hiddenfields(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));
}
受保护的无效页面加载(对象发送方,事件参数e)
{
//Value将json数据存储为字符串
List myClassList=JsonConvert.DeserializeObject
(HiddenField.Value);
//收集一些东西
}
受保护的void AddButton\u单击(对象发送者,事件参数e)
{
List myClassList=JsonConvert.DeserializeObject
(HiddenField.Value);
添加(新的MyClass{Name=NameTextBox.Text});
Value=JsonConvert.SerializeObject(myClassList));
}
在这里,我将集合作为Json存储在一个隐藏字段中,并使用Json.net对其进行序列化/反序列化。这就解决了标签页的问题,因为每个页面现在都负责它的打开状态


我的问题是,我的结论是,只有在跨多个页面记住数据时,才应该使用会话,对吗?使用隐藏字段总是更好吗?我看到许多例子,人们使用会话来记住单个页面中的状态,因此我可能会遗漏一些内容。

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


直接使用ViewState是一个不错的选择。或者,如果需要从客户端访问其中的值,那么使用HiddenFields也可以。这实际上是使用ViewState和HiddenFields之间的决定点。

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


直接使用ViewState是一个不错的选择。或者,如果需要从客户端访问其中的值,那么使用HiddenFields也可以。这实际上是使用ViewState和HiddenFields之间的决定点。

如果数据特定于单个页面,请使用
ViewState
。如果数据需要与客户端代码共享,则移动到
HiddenField
。如果数据需要在多个页面请求之间保持,请转到
会话


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

如果数据特定于单个页面,请使用
ViewState
。如果数据需要与客户端代码共享,则移动到
HiddenField
。如果数据需要在多个页面请求之间保持,请转到
会话

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