【问题标题】:Do I have to use Viewstate in ASP.NET我必须在 ASP.NET 中使用 Viewstate
【发布时间】:2008-09-25 13:22:08
【问题描述】:

我正在从经典的 ASP 迁移到 ASP.NET,并且遇到了你们许多人已经知道的“视图状态”。我的假设可能会过激,但它看起来非常麻烦。我过去开发了许多 ASP 表单,并且从未遇到过保持状态的问题。有没有其他方法或者我必须在 ASP.NET 中学习这个 Viewstate 的东西?我使用 Visual Studio 2008、VB.NET 作为语言背后的代码,以及带有 SQL Server 2005 的 Framework v3.5。

【问题讨论】:

  • MVC 框架看起来确实很有趣!谢谢比里!

标签: asp.net vb.net visual-studio viewstate state


【解决方案1】:

您不必这样做。查看MVC framework。它消除了 ViewState 并像旧的 ASP 一样工作(至少从这个角度来看)。

【讨论】:

  • 谢谢。我要检查一下这个 MVC 的东西。
【解决方案2】:

This series of posts is must reading for understanding ViewState

我禁用它并在 Page_Init 而不是 Load 中完成大部分工作(由于 ControlState,值仍然保持不变)。这个设置对我来说效果很好。

【讨论】:

    【解决方案3】:

    ViewState 是可选的,但很有帮助。 ViewState 是发生在服务器端控件上的所有更改。因此,如果您将文本分配给标签,并且您希望该文本持续存在而不需要在每次回发时重新分配它,那么您将需要维护它。另一个我总是打开 ViewState 的例子是任何数据绑定。

    也就是说,有时出于同样的原因关闭 ViewState 会很有帮助。例如,我总是关闭 ViewState 的一个地方是 MESSAGE 标签。这样,当我必须向用户打印一条消息(一条应该只出现一次然后消失的消息)时,我只需将文本添加到标签然后忘记它。在下一次 PostBack 期间,标签将自动恢复为在该控件的 ASPX 声明中找到的文本(在本例中为空字符串)。

    现在,请注意这与表单集合无关,表单集合是在 PostBack 期间发布到 IIS 的值。表单集合将用户输入的值发送到表单元素(文本框、复选框、下拉列表等)中。这些 .NET 将填充到适当的位置 - 这发生在 ViewState 已处理之后

    这样,如果您向客户端发送带有短语“hi there”的文本框,用户将其更改为“See ya”,然后提交表单,那么在 Page_Load 事件触发时文本框将具有TEXT 属性中带有“See ya”的文本框。

    【讨论】:

      【解决方案4】:

      在经典的 ASP 中,我们总是只使用一个 HIDDEN 字段来完成这项工作。 Viewstate 只是自动为您执行此操作的一种方式。相信我,学习曲线并没有你想象的那么高。

      【讨论】:

      • 我做了很多经典的 ASP,当我第一次迁移到 ASP.Net 时,它让我大吃一惊。但是,一旦您习惯了该模型,与旧的做事方式相比,它就相当不错了。如果我再也不用看另一个 ADO 记录集,我会很高兴 :)
      • 我目前正处于“让我大吃一惊”的模式。 :-) 就像其他一切一样,总有一天它会发生。
      • VIEWSTATE其实是.NET自动添加到页面的隐藏字段,viewstate中需要维护的值被打包到该隐藏字段中。
      【解决方案5】:

      当您关闭 ViewState 时,某些控件会严重受损,因此请准备好解决这些问题。最简单的做法是懒惰并保持打开状态,但如果不加以检查,ViewState 很容易占 HTML 大小的 30%。

      例如,假设您有一个 DropDown,并将其绑定到一个水果列表。您将它绑定在页面加载的 if(!IsPostBack) { } 块中。如果关闭 ViewState,单击按钮时将丢失项目。他们需要绑定每个页面加载。您还将丢失您选择的索引,因此您需要将其从 Request.Form[] 变量中移除。

      【讨论】:

      • 尺寸是一个问题。另一个问题是“未知”和学习曲线——我从这些答案中看到的可能并不像看起来那么糟糕。谢谢!
      【解决方案6】:

      当您使用 ASP.NET 时,Viewstate 是包的一部分。对于基本页面/网站,您不必“知道”如何使用 Viewstate。当您在页面上放置控件时,它就会被使用。

      使用 ASP.NET 很难避免使用 Viewstate,因为即使您在项目级别将其关闭,一些单独的控件仍然使用 Viewstate 来保存其信息。

      如果您不想处理 Viewstate,请考虑使用 ASP.NET MVC 框架。您可能会更喜欢来自 Classic ASP 的 MVC 框架。

      【讨论】:

        【解决方案7】:

        ViewState 在几乎所有情况下都是完全可选的。即使 ViewStateEnabled=false,ASP.NET 也会自动重新填充字段。我使用 ASP.NET 已经 5 或 6 年了,从来没有依赖过 ViewState。我什至尽可能禁用它。

        【讨论】:

        • 我将不得不对此进行试验。感谢您的回复。
        • 了解ViewState和ControlState的区别
        【解决方案8】:

        ViewState 在大多数情况下是自动工作的。这就是 ASP.NET 跟踪其所有控件的当前状态的方式。

        如果您想存储一些额外的数据,您也可以手动使用视图状态。这很简单:

        Viewstate["Key"] = value;
        

        唯一需要注意的是,您存储在视图状态中的任何对象都必须是可序列化的。

        【讨论】:

          【解决方案9】:

          我绝对可以建议避免在 DataGrids 和 DropDownLists 中使用 ViewState,因为我最近才开始自己做。我这样做不是为了好玩,我必须修复一个已经变得如此之大以至于导致其他问题的页面。但事实证明这很容易,结果如此戏剧性,我很高兴。当然,对于一个小型简单的应用程序或少量数据,这不是必需的,但另一方面,保持一致是件好事(总是从已知到已知,这样您就可以不断改进您的流程......),以及为什么随身携带额外的行李吗?

          这需要您进行一些手动干预。例如,如果您关闭下拉列表的视图状态,则需要在每次回发时重新绑定它们,然后从 Request 对象中恢复 SelectedValue。您需要阅读此内容,但谷歌有很多现成的信息。

          【讨论】:

            【解决方案10】:

            对于“植根于”页面的 asp.net 控件,视图状态会自动保留。您几乎不需要做任何事情,值和其他一些信息在隐藏输入 B64 编码中传递。如果你愿意,你可以看它,但没关系,这一切都是为你自动处理的。

            【讨论】:

            • 我已经开始看那个编码并且想“伙计!那是什么?!”并阅读它,但确实看到或知道是否有替代方案。 Bri 说要研究 MVC 框架,我可能会。谢谢!
            • @Optimal Solutions:您不需要了解编码的视图状态值。这是 .NET 自动为您处理的隐藏功能 - 它只是存储视图状态的方式。
            【解决方案11】:

            如果您编写代码供自己使用,您可以将其关闭而无需担心。

            假设您要维护由其他人编写的 Web 表单代码,因此您应该知道配置选项和痛点是什么。我能想到的前几个

            • 如何在站点、页面和控制级别禁用它
            • 为什么 MachineKey 与网络农场相关
            • 为什么您的事件日志中充满了 ViewStateAuthentication 错误
            • ViewStateUserKey 是什么

            就实际学习曲线而言,这可能是对几篇 MSDN 文章的透彻阅读。

            【讨论】:

            • 感谢您的帮助。我需要抽出一些时间来阅读那些 MSDN 文章。我只是喜欢这样一个事实,即 10 多年前,我只需要记事本就能够直接进入 ASP,并且在几个小时内完成了一个相当大的应用程序。这次不会这样了。
            【解决方案12】:

            ViewState 是 Web 表单隐喻固有的必要邪恶。我个人认为这种方法已经过时、臃肿而且通常对网络不友好。最好按照上面的建议检查 MVC 框架。

            我建议您避免使用 ViewState 作为“缓存”来来回传递数据的诱惑(我已经看到网站这样做是因为集群设置和没有 SQL 支持的会话状态)。数据被序列化并添加到页面中,并且必须在每个请求中进行往返,这会增加页面的总大小并使您的网站加载速度变慢。

            【讨论】:

              【解决方案13】:
              '<%@ Control Language="C#" AutoEventWireup="true" CodeFile="HomePage.ascx.cs" Inherits="HomePage" %>
              <script runat="server">
                void testHF_ValueChanged(object sender, EventArgs e)
                  {
                     this.HFvalue.Text = this.testHF.Value ;
              
                  }
              </script>
              <asp:Label ID="UserNamelbl" runat="server" Text="User Name : " Visible="false"></asp:Label>
              <asp:TextBox ID="UserNametxt" runat="server" Visible="false" ></asp:TextBox>
               <asp:Label ID="HFvalue" Text="......" runat="server"></asp:Label>
               <asp:HiddenField ID="testHF"
              OnValueChanged="testHF_ValueChanged"
              value="" 
              runat="server" ></asp:HiddenField>
              <input type="submit" name="SubmitButton" value="Submit" onclick="CL()" />
              
              <script type="text/javascript">
                  function CL() 
                  {
                      this.testHF.Value = this.UserNametxt.Text;  
                  }
              </script>
              '
              

              【讨论】:

              • 嗨,阿卜杜拉,欢迎来到 SO。这是一个非常古老的问题。在发布答案之前检查下一次发布问题的时间!
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2017-11-05
              • 1970-01-01
              • 1970-01-01
              • 2022-06-22
              • 1970-01-01
              • 2016-01-24
              • 2013-10-05
              相关资源
              最近更新 更多