gpt4 book ai didi

c# - 跨 ASP.NET 回发的数据持久性

转载 作者:可可西里 更新时间:2023-11-01 08:13:01 25 4
gpt4 key购买 nike

上下文:

我经常遇到这样的情况,我们的 ASP.NET 页面必须在 GridView 上向用户显示数据,让他随心所欲地更改它(单元格上的文本框),并且只在他实际使用时才将其保存到数据库中点击“保存按钮”。此数据通常是页面上信息的虚拟状态,这意味着用户可以更改所有内容而无需真正保存,直到他点击“保存按钮”。在这些情况下,始终存在需要在 ASP.NET 回传中保留的数据列表。此数据可能是 DataTable 的一个实例或者只是一些 List<Someclass> .

我经常看到人们实现这一点并将数据保存在 Session 上.在那种情况下,当涉及到某些用户在打开多个选项卡的情况下进行导航时,我通常也会遇到问题,有时在同一页面上。两个不同标签的数据会合并并导致信息被扰乱的问题。

Session常用的例子:

private List<SomeClass> DataList
{
get
{
return Session["SomeKey"] as List<SomeClass>;
}
set
{
Session["SomeKey"] = value;
}
}

人们经常试图通过做这样的事情来解决它:

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataList = null
}
else
{
FillGridView(DataList);
}
}

但是当两个选项卡已经加载并且用户正在更改 GridView 值并且由于某些奇怪的原因他试图通过点击另一页上的保存按钮来保存数据时怎么办?我个人不喜欢这个选项。

执行此操作的其他方法是将数据放在 ViewState 上.但是,当涉及到持久化相当大的列表时,当它存储在页面上时,它可能会对页面产生严重影响 (HiddenField)。

但是,实现这一目标的最佳方式是什么?有一次,我想用 Session连同 ViewState ViewState在哪里将持有一个唯一标识符,该标识符将索引 Session保存的数据。这将阻止在浏览器的选项卡之间共享数据:

private List<SomeClass> DataList
{
get
{
if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}

return Session[ViewState["SomeKey"].ToString()] as List<SomeClass>;
}
set {

if (ViewState["SomeKey"] == null)
{
ViewState["SomeKey"] = Guid.NewGuid().ToString();
}

Session[ViewState["SomeKey"].ToString()] = value;
}
}

另一方面,每次用户进入页面时,它都会将新的数据列表存储到 Session 中。这会影响服务器内存。也许可以通过某种方式删除它们。

问题:

考虑到浏览器上多个选项卡的上下文,以较少的服务器和维护编码团队成本,跨回发持久保存此类数据的最佳方法是什么?

更新:

正如@nunespascal 很好地发布的那样,一种选择是存储 ViewStateSession使用 SessionPageStatePersister .但不幸的是,这不是我的选择。然而,它与我上一个示例并没有太大不同,将数据保存在由存储在 ViewState 中的 UniqueId 索引的 session 中。

还有其他选择吗?

最佳答案

这个问题有一个简单的解决方案。将 ViewState 存储在 session 中。

为此你需要使用SessionPageStatePersister

引用:Page State Persister

您需要做的就是覆盖 PageStatePersister 并使其使用 SessionPageStatePersister而不是默认的 HiddenFieldPageStatePersister

protected override PageStatePersister PageStatePersister
{
get
{
return new SessionPageStatePersister(this);
}
}

这甚至可以让您省去维护唯一 key 的麻烦。将自动使用一个隐藏字段来为页面的每个实例保留一个唯一的键。

关于c# - 跨 ASP.NET 回发的数据持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14873879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com