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

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

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

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

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

【问题讨论】:

    标签: asp.net url viewstate clean-urls


    【解决方案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。

            【讨论】:

              猜你喜欢
              • 2014-11-02
              • 2013-12-23
              • 1970-01-01
              • 2012-03-08
              • 1970-01-01
              • 2016-10-12
              • 2021-10-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多