【问题标题】:ViewState or HiddenFieldViewState 或 HiddenField
【发布时间】:2009-01-08 13:05:30
【问题描述】:

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

为什么我会选择一个而不是另一个?

视图状态

  • 用户难以解码(认为并非不可能),这可能是可取的

隐藏字段

  • 值可以在 JavaScript 中使用

还有其他优点和缺点吗?

【问题讨论】:

  • 也可以在Session对象中存储数据
  • 是的,我可以将其存储在 Session 中,但是在这种情况下,数据仅与相关页面相关,因此出于封装原因,我更愿意将其存储在页面上。
  • 将数据存储在会话中本质上会使其在范围内具有全局性。将其存储在页面中会缩小其范围,这是更好的设计实践。
  • 同意,如果它只与页面相关。我会选择 ViewState,主要是因为 dant 指出的原因。

标签: asp.net viewstate hidden-field


【解决方案1】:

并非如此,ViewState 实际上存储在隐藏字段中,因此唯一真正的区别是编码。

除非您需要使用 JavaScript 操作该值,或者您希望完全关闭此页面上的 ViewState,否则我会使用 ViewState。主要是因为有第三方工具 (like this one) 可以理解 ViewState 而无法理解您的自定义隐藏字段。

【讨论】:

【解决方案2】:

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

如果您对此不太满意,请在页面上编写一个属性访问器,作为外观来从 ViewState 中检索值。稍后,如果您觉得有必要将其转换为隐藏字段,则访问器可以在其余代码中无缝地处理该开关。请务必记录您这样做的原因。

【讨论】:

    【解决方案3】:

    Viewstate 仅适用于您所在的页面或发回的页面。使用隐藏字段,您可以使用 Page 对象的 PreviousPage 方法访问您导航到的下一页上的数据(以及其他数据),如下所示:

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

    【讨论】:

      【解决方案4】:

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

      我们还可以将应用程序配置为save the viewstate on server 而不是页面本身,这可能会避免一些安全问题。

      结合

      【讨论】:

      • 我不确定页面大小参数在此处是否有效 - 无论我将值存储在 ViewState 中还是向页面添加附加控件并将值存储在那里,页面大小都会增加跨度>
      • 同意 Richard E 关于页面大小的说法;另一方面,同意 Jomit 关于能够在服务器上存储视图状态的观点。
      【解决方案5】:

      隐藏字段在页面上是不可见的,它们的值可以在视图源中查看,但视图状态的值是编码的,不可读。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 2013-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多