2009-01-08 37 views
7

如果我有一个简单的数据要存储(例如整数或字符串)我可能会选择将其存储在ViewState中,或使用HiddenField控件。ViewState或HiddenField

为什么我会选择一个呢?

视图状态

  • 硬供用户进行解码(被认为不是不可能的),这可能是可取的

HiddenField

  • 值可以在JavaScript
可以使用

是否还有其他优点缺点?

+0

您还可以将数据存储在会话对象 – 2009-01-08 13:34:00

+0

是的,我可以将其存储在会话中,但在这种情况下,数据仅与相关页面相关,因此出于封装原因,我宁愿将其存储在页面上。 – 2009-01-08 13:50:33

+1

将会话中的数据存储在本质上会使其成为全局范围。将它存储在页面中会减少它的范围,这是更好的设计实践。 – 2009-01-08 13:52:40

回答

6

不是真的,ViewState实际上存储在一个隐藏字段中,所以唯一真正的区别是编码。

除非您需要使用JavaScript处理值,或者您希望完全关闭此页面上的ViewState,那么我会使用ViewState。主要是因为有第三方工具(like this one)了解ViewState并且不了解您的自定义隐藏字段。

0

ViewState存储在页面本身,因此它增加了页面大小,它可能会导致performance issues

此外,我们可以将应用程序配置为save the viewstate on server,而不是在页面本身上,以防止某些安全问题。

jomit

3

从可维护性的角度来看,我会使用ViewState。它可以让你编写更少的代码,这可以归结为软件中的更少的故障点。这也意味着任何追随你的开发人员都能更轻松地维护你的解决方案。

如果您对此不太满意,可以在页面上编写一个属性存取器,作为外观从ViewState中检索值。后来,如果您觉得不得不将其转换为隐藏字段,那么访问者可以在其他代码中无缝地处理该开关。只要确保你记录你这样做的理由。

0

Viewstate只在您所在的页面上发布或发布回来。一个隐藏字段,你可以通过使用Page对象|上一页方法,像这样访问你导航到(以及其他数据)下页上的数据:

string term = ((TextBox)Page.PreviousPage.FindControl("txtSearchTerm")).Text; 
0

隐藏字段是页和无形的值可以在视图源中查看,但视图状态的值被编码且不可读。

隐藏字段值将发布到下一页。 (注意:使用server.transfer来获取隐藏字段的值)。