如果我有一段简单的数据要存储(例如整数或字符串),我可能会选择将其存储在 ViewState 中,或者使用 HiddenField 控件。
为什么我会选择一个而不是另一个?
视图状态
- 用户难以解码(认为并非不可能),这可能是可取的
隐藏场
- 值可以在 JavaScript 中使用
还有其他优点和缺点吗?
如果我有一段简单的数据要存储(例如整数或字符串),我可能会选择将其存储在 ViewState 中,或者使用 HiddenField 控件。
为什么我会选择一个而不是另一个?
视图状态
隐藏场
还有其他优点和缺点吗?
并非如此,ViewState 实际上存储在隐藏字段中,因此唯一真正的区别是编码。
除非您需要使用 JavaScript 操作该值,或者您希望完全关闭此页面上的 ViewState,否则我会使用 ViewState。主要是因为有第三方工具(比如这个)可以理解 ViewState 并且不会理解您的自定义隐藏字段。
从可维护性的角度来看,我会使用 ViewState。您编写的代码更少,这归结为软件中的故障点更少。这也意味着任何追随您的开发人员都可以更轻松地维护您的解决方案。
如果您对此并不完全满意,请在页面上编写一个属性访问器,作为外观来从 ViewState 中检索值。稍后,如果您觉得有必要将其转换为隐藏字段,则访问器可以在其余代码中无缝地处理该开关。请务必记录您这样做的原因。
Viewstate 仅适用于您所在的页面或发回的页面。使用隐藏字段,您可以使用 Page 对象的 PreviousPage 方法访问您导航到的下一页上的数据(以及其他数据),如下所示:
string term = ((TextBox)Page.PreviousPage.FindControl("txtSearchTerm")).Text;
隐藏字段在页面上是不可见的,它们的值可以在视图源中查看,但视图状态的值已编码并且不可读。
隐藏字段值发布在下一页。(注意:使用 server.transfer 获取隐藏字段的值)。