15

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

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

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

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

4

6 回答 6

35

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

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

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

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

于 2009-03-15T07:52:29.290 回答
10

在编写Reputation Tracker时,我遇到了类似的问题

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

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

于 2009-03-15T07:52:33.860 回答
8

<page>默认情况下,使用web.config 中的元素关闭 ViewState 。EnableViewState="true"在 web.config 中禁用 ViewState 后,在指令中使用@Page将不再起作用。<location>如果您稍后决定需要特定页面的 ViewState,则可以使用元素为该页面重新打开它。

<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 的页面使用的任何母版页执行相同的操作。

于 2012-10-23T21:11:38.510 回答
4

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

<Pages enableViewState="false"/> 
于 2009-03-15T07:51:28.823 回答
3

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

于 2009-03-15T08:03:28.233 回答
2

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

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

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

于 2009-03-15T10:40:12.820 回答