ASP.NET Webforms中的ViewState替代方案

5
有没有其他的ViewState替代方案?我听说过像Session这样的方案,它可以保存页面控件状态并在用户离开页面时被销毁。
我知道我正在描述ViewState本身,但我正在寻找一种模式或建议,以便完全避免使用ViewState。
我使用它的一个例子是将我的网格(ViewModels列表)的内容存储到ViewState中。这有助于了解哪些条目是脏的,哪些已经被修改,它们的索引,当前选择的对象等。
4个回答

3
我的同事开发了一种方法,可以将视图状态数据存储在文件中,这样就不必在客户端和服务器之间传输大量的视图状态数据。只需将表示视图状态数据文件的密钥(即视图状态数据文件)保存为会话变量即可。在我们的测试中,我们发现将视图状态保存在文件中可以通过减少视图状态的数量(当时非常巨大)来降低服务器响应时间。

在这篇文章的“在服务器上保留视图状态”部分中,您可以了解如何实现该方法。您甚至可以将视图状态数据存储在数据库表中,这样如果您的应用程序在 Web Farm 上运行,则具有额外的灵活性。


尽管这似乎不是一种选择,但您可以在不改变整个架构的情况下提高应用程序的性能。 - Zafer
我一定会研究这个的。 - Jonn

1

另一种选择是压缩您的ViewState。虽然仍会增加往返数据量,但通常很小。

如果您正在使用 .Net 4,则有一些有用的新ViewState添加:

ASP.NET 4.0: 更多控制 ViewState 管理


Tsk。我们大多数应用程序仍在使用 .Net 3.5 进行开发。 - Jonn

1

我认为你没有理由放弃使用ViewState。

如果你要持有大量的数据,将其持久化到其他地方可能会出现问题。使用Session吗?那么它会消耗过多的内存,或者如果采用外部进程,每次加载/写入Session时都需要移动所有数据(每个请求一次)。当然,你可以尝试通过尽早释放存储的数据来限制这个问题,例如在asp.net MVC中使用TempData。

你可以通过引入时间戳/记录版本来最小化需要存储的信息量,以检查修改的记录。这样,你只需检查新版本是否已添加,并向用户展示他们尝试保存的内容以及其他人保存的内容。


0

你有Session,也有Cache

Session是每个用户的,Cache是全局性的。

你真的需要把所有这些都存储在ViewState中吗?为什么不在提交时(但是由于你的问题非常含糊,我在这里做出了一些假设)从数据库获取所有旧数据,与新数据进行比较,并更新更改的部分呢?


我更喜欢将状态存储在我的视图中,作为ViewModels,这样会让我感到更加舒适。(我只保留了我认为对控件正常运行真正必要的内容。)其他所有内容都会在postback时重新创建。总的来说,从数据库获取、重新创建ViewModels,然后进行比较会更慢吗? - Jonn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接