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

时间:2020-03-06 14:43:11  来源:igfitidea点击:

我正在从经典的ASP迁移到ASP.NET,并且遇到了许多我们已经知道的" viewstate"。我可能以我的假设为准,但是看起来很麻烦。过去,我开发了许多ASP表单,但从未遇到过保持状态的问题。还有另一种方法,还是我必须在ASP.NET中学习此Viewstate内容?我使用Visual Studio 2008,VB.NET作为SQL Server 2005语言和Framework v3.5的背后代码。

解决方案

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

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

不用了查看MVC框架。它消除了ViewState并可以用作旧的ASP(至少从这个角度而言)。

对于"植根"到页面的asp.net控件,Viewstate会自动保留。我们几乎无需执行任何操作,这些值和其他一些信息以B64编码的隐藏输入传递。我们可以根据需要查看它,但这无关紧要,一切都由我们自动完成。

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

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

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

使用ASP.NET避免使用Viewstate是非常困难的,因为即使在项目级别将其关闭,某些单独的控件仍会使用Viewstate来保留其信息。

如果我们不想使用Viewstate,请考虑使用ASP.NET MVC框架。我们可能会更喜欢Classic ASP的MVC框架。

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

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

Viewstate["Key"] = value;

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

如果我们要编写代码供自己使用,则可以将其关闭而不用担心。

大概我们将维护其他人编写的Web Forms代码,因此我们应该知道什么是配置选项和痛点。我能想到的前几名

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

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

ViewState是Web表单隐喻固有的必要手段。我个人认为此方法过时,过时且通常不适合网络使用。最好按照上面的建议检查MVC框架。

我建议我们避免将ViewState用作来回传递数据的"缓存"的诱惑(由于群集设置和无SQL支持的会话状态,我见过网站这样做。数据被序列化并添加到页面,并且必须对每个请求进行往返,这会增加页面的总大小,并使网站加载速度变慢。

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

这将需要我们进行一些手动干预。例如,如果关闭下拉列表的视图状态,则需要在每次回发时重新绑定它们,然后从Request对象还原SelectedValue。我们需要阅读相关内容,但是google有很多随时可用的信息。

ViewState是可选的,但很有帮助。 ViewState是什么,是在SERVER SIDE的控件上发生的所有更改。因此,如果我们要为标签分配文本,并且希望该文本持久存在而无需在每次回发中重新分配,那么我们将需要维护该文本。我始终将ViewState保持打开状态的另一个示例是任何数据绑定。

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

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

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

必须阅读本系列文章才能理解ViewState

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