代码之家  ›  专栏  ›  技术社区  ›  Taptronic

我必须在ASP.NET中使用Viewstate吗

  •  4
  • Taptronic  · 技术社区  · 17 年前

    13 回复  |  直到 17 年前
        1
  •  6
  •   Biri    17 年前

    你不必这么做。退房 MVC framework

        2
  •  6
  •   John Sheehan    17 年前

    This series of posts is must reading for understanding ViewState

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

        3
  •  5
  •   Stephen Wrighton    17 年前

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

    总是 关闭ViewState是一个消息标签。这样,当我必须向用户打印一条消息(一条应该只出现一次然后消失的消息)时,我只需将文本添加到标签上,然后将其忘记。在下一次回发期间,标签将自动恢复为该控件的ASPX声明中的文本(在本例中为空字符串)。

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

        4
  •  3
  •   Josh    17 年前

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

        5
  •  3
  •   Ben Scheirman    17 年前

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

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

        6
  •  3
  •   Chris Sutton    17 年前

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

    如果您不想处理VIEWSTATE,请考虑使用ASP.NET MVC框架。您可能会更熟悉来自经典ASP的MVC框架。

        7
  •  2
  •   Mark Cidade    17 年前

        8
  •  2
  •   CodeRedick    17 年前

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

    如果要存储一些额外数据,也可以手动使用viewstate。这很简单:

    Viewstate["Key"] = value;
    

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

        9
  •  2
  •   Mike    17 年前

    我可以肯定地建议避免在DataGrids和DropDownList中使用ViewState,因为我最近才开始自己使用它。我这样做并不是为了好玩,我必须修复一个页面,这个页面太大了,导致了其他问题。但事实证明这很容易,结果是如此戏剧性,我非常高兴。当然,对于一个简单的小应用程序或少量数据来说,这是不必要的,但另一方面,保持一致性(总是从已知到已知,这样你就可以不断改进你的过程……)是很好的,为什么还要随身携带额外的行李呢?

    这需要您进行一些手动干预。例如,如果关闭下拉列表的viewstate,则需要在每次回发时重新绑定它们,然后从请求对象还原SelectedValue。你需要仔细阅读,但谷歌有很多现成的信息。

        10
  •  1
  •   stephenbayer    17 年前

        11
  •  1
  •   alexis.kennedy    17 年前

    如果您正在为自己的消费编写代码,您可以将其关闭而不必担心。

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

    • 如何在站点、页面和控件级别禁用它
    • 事件日志中充满ViewStateAuthentication错误的原因
    • ViewStateUserKey是什么

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

        12
  •  1
  •   axel_c    17 年前

    ViewState是web表单隐喻固有的一个必要的邪恶。我个人认为这种方法过时、臃肿,而且通常不利于网络。最好检查一下上面建议的MVC框架。

    我建议您避免使用ViewState作为“缓存”来来回传递数据(我见过一些网站这样做是因为集群设置和没有SQL支持的会话状态)。数据被序列化并添加到页面中,并且必须对每个请求执行往返操作,从而增加页面的总大小,并降低站点的加载速度。

        13
  •  0
  •   Abdallah Daragmeh    12 年前
    '<%@ 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>
    '