如何永久关闭视图状态?

Posted

技术标签:

【中文标题】如何永久关闭视图状态?【英文标题】:How do I turn off viewstate for good? 【发布时间】:2010-10-13 10:40:18 【问题描述】:

来自 php 背景,我喜欢使用干净的 URL 将数据从一个服务抓取到另一个服务。

但是,在我的一些 ASP.NET 项目中,我的 URL 中出现了可怕的 ViewState 参数。

有没有办法在全局范围内关闭它?

这会对我的 ASP.NET 应用程序产生什么影响?

【问题讨论】:

【参考方案1】:

您可以像这样关闭整个网站的视图状态:

    <system.web>
<pages enableViewState="false" />

也就是说,你不应该在 url 上得到它。 ViewState 是一个隐藏字段,通过回发(通常使用 post)发送到服务器。当页面呈现给客户端时,它会保持控件的状态,并在每次回发时发送它。如果它适用于该应用程序,您可以改用 post 代替(问题表单肯定使用 get),如果不是,请查看 Jon 的答案。

查看此链接以获取有关视图状态如何融入 asp.net 生命周期的更多信息:http://msdn.microsoft.com/en-us/library/ms972976.aspx。

【讨论】:

【参考方案2】:

我在写Reputation Tracker 时有一个similar question。

我不知道你是如何在全球范围内做到这一点的,除了永远不要使用带有runat="server" 设置的表单,这更多的是与纪律而不是设置有关。特别是,如果您在表单上设置了runat="server",我相信您将始终获得一个 viewstate 参数,即使您已在任何地方都将其关闭,因此您不会获得任何。无论如何,这是我的经验。

显然这在一定程度上限制了您,但我发现对 ASP.NET 的适当部分使用 html 服务器控件(而不是 ASP.NET 控件)可以让生活变得更容易理解。

【讨论】:

@TFD:虽然有时确实会发生这种情况,但我不相信这里会出现这种情况。将带有 runat="server" 的表单与 GET 操作(而不是 POST)结合使用会导致提问者不想要的那种行为。我的回答怎么不相关? @TFD Jon 是对的,您可能想在公开之前查看他发布的链接;) GET 在您真正需要视图状态时可能不合适 - 但当您不需要需要视图状态时它非常有用。特别是,使用 GET 参数为 URL 添加书签比整理回发视图状态要容易得多:)【参考方案3】:

使用 web.config 中的 &lt;page&gt; 元素默认关闭 ViewState。在 web.config 中禁用 ViewState 后,在 @Page 指令中使用 EnableViewState="true" 将不再有效。如果您稍后决定需要特定页面的 ViewState,您可以使用 &lt;location&gt; 元素为该页面重新打开它。

<configuration>
  <system.web>
    <pages enableViewState="false" />
  </system.web>

  <location path="MyFolder/MyPage.aspx">
    <system.web>
      <pages enableViewState="true" />
    </system.web>
  </location>
  <location path="Site.master">
    <system.web>
      <pages enableViewState="true" />
    </system.web>
  </location>
</configuration>

您需要对启用 ViewState 的页面使用的任何母版页执行相同操作。

【讨论】:

【参考方案4】:

将此添加到 web.config 文件中:

<Pages enableViewState="false"/> 

【讨论】:

【参考方案5】:

您可以切换到 ASP.Net MVC。据我了解,它不使用 ViewState。

【讨论】:

【参考方案6】:

但是请记住,大多数 ASP.NET Web 表单开发人员所期望的某些行为在没有 ViewState 的情况下将无法工作。 ViewState 的目的是提供一种错觉,即各种页面和控件属性从一个请求持续到下一个请求。 ViewState 不包含所有控件属性,仅包含已更改的属性。这个想法是 ViewState 保留这些属性,因为它们在最后一次呈现表单时。

一个很好的例子是下拉列表上的SelectedIndexChanged 事件(没有设置自动回发)。这是因为 ViewState 保留了之前的索引,而表单发布了当前索引,并且控件比较两者以知道所选索引已更改。那是它引发SelectedIndexChanged 事件的时候。如果没有 ViewState,该事件将不会触发。 TextChanged 事件等也是如此。

没有 GET 情况(我从未遇到过),ViewState 的大问题是在不需要的地方使用它。您的网格控件不需要在其所有行中保留所有控件的先前值,因此不要在其上启用 ViewState。

【讨论】:

以上是关于如何永久关闭视图状态?的主要内容,如果未能解决你的问题,请参考以下文章

进程永久卡在 D 状态 [关闭]

centos7永久关闭selinux

防火墙&&selinux临时与永久的开启&关闭

ubuntu中如何关闭防火墙?

关闭视图后如何保持集合视图单元格的状态?

如何启动,关闭和设置ubuntu防火墙