如果我有一个简单的数据要存储(例如整数或字符串)我可能会选择将其存储在ViewState中,或使用HiddenField控件。ViewState或HiddenField
为什么我会选择一个呢?
视图状态
- 硬供用户进行解码(被认为不是不可能的),这可能是可取的
HiddenField
- 值可以在JavaScript
是否还有其他优点缺点?
如果我有一个简单的数据要存储(例如整数或字符串)我可能会选择将其存储在ViewState中,或使用HiddenField控件。ViewState或HiddenField
为什么我会选择一个呢?
视图状态
HiddenField
是否还有其他优点缺点?
不是真的,ViewState实际上存储在一个隐藏字段中,所以唯一真正的区别是编码。
除非您需要使用JavaScript处理值,或者您希望完全关闭此页面上的ViewState,那么我会使用ViewState。主要是因为有第三方工具(like this one)了解ViewState并且不了解您的自定义隐藏字段。
ViewState存储在页面本身,因此它增加了页面大小,它可能会导致performance issues。
此外,我们可以将应用程序配置为save the viewstate on server,而不是在页面本身上,以防止某些安全问题。
jomit
从可维护性的角度来看,我会使用ViewState。它可以让你编写更少的代码,这可以归结为软件中的更少的故障点。这也意味着任何追随你的开发人员都能更轻松地维护你的解决方案。
如果您对此不太满意,可以在页面上编写一个属性存取器,作为外观从ViewState中检索值。后来,如果您觉得不得不将其转换为隐藏字段,那么访问者可以在其他代码中无缝地处理该开关。只要确保你记录你这样做的理由。
Viewstate只在您所在的页面上发布或发布回来。一个隐藏字段,你可以通过使用Page对象|上一页方法,像这样访问你导航到(以及其他数据)下页上的数据:
string term = ((TextBox)Page.PreviousPage.FindControl("txtSearchTerm")).Text;
隐藏字段是页和无形的值可以在视图源中查看,但视图状态的值被编码且不可读。
隐藏字段值将发布到下一页。 (注意:使用server.transfer来获取隐藏字段的值)。
您还可以将数据存储在会话对象 – 2009-01-08 13:34:00
是的,我可以将其存储在会话中,但在这种情况下,数据仅与相关页面相关,因此出于封装原因,我宁愿将其存储在页面上。 – 2009-01-08 13:50:33
将会话中的数据存储在本质上会使其成为全局范围。将它存储在页面中会减少它的范围,这是更好的设计实践。 – 2009-01-08 13:52:40