来自 PHP 背景,我喜欢使用干净的 URL 将数据从一个服务抓取到另一个服务。
但是,在我的一些 ASP.NET 项目中,我的 URL 中出现了可怕的 ViewState 参数。
有没有办法在全球范围内关闭它?
这会对我的 ASP.NET 应用程序产生什么影响?
来自 PHP 背景,我喜欢使用干净的 URL 将数据从一个服务抓取到另一个服务。
但是,在我的一些 ASP.NET 项目中,我的 URL 中出现了可怕的 ViewState 参数。
有没有办法在全球范围内关闭它?
这会对我的 ASP.NET 应用程序产生什么影响?
您可以像这样关闭整个站点的视图状态:
<system.web>
<pages enableViewState="false" />
也就是说,你不应该在 url 上得到它。ViewState 是一个隐藏字段,它通过回发(通常使用 post)发送到服务器。当页面呈现给客户端时,它会保持控件的状态,并在每次回发时发送它。如果它适用于应用程序,您可以改用 post 代替(问题形式肯定使用 get),如果不是,请查看 Jon 的答案。
查看此链接以获取有关视图状态如何融入 asp.net 生命周期的更多信息:http: //msdn.microsoft.com/en-us/library/ms972976.aspx。
在编写Reputation Tracker时,我遇到了类似的问题。
我不知道你是如何在全球范围内做到这一点的,除了永远不要使用带有runat="server"
集合的表单,这更多的是与纪律而不是设置有关。特别是,如果您runat="server"
在表单上进行了设置,我相信您将始终获得 viewstate 参数,即使您已在任何地方将其关闭,因此您不会获得任何值。无论如何,这是我的经验。
显然这在一定程度上限制了您,但我发现对 ASP.NET 的适当部分使用 HTML 服务器控件(而不是 ASP.NET 控件)可以使生活更易于理解。
<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 的页面使用的任何母版页执行相同的操作。
将此添加到 web.config 文件中:
<Pages enableViewState="false"/>
您可以切换到 ASP.Net MVC。据我了解,它不使用 ViewState。
但是请记住,如果没有 ViewState,大多数 ASP.NET Web 表单开发人员所期望的某些行为将无法工作。ViewState 的目的是提供一种错觉,即各种页面和控件属性从一个请求持续到下一个请求。ViewState 不包含所有控件属性,仅包含已更改的属性。这个想法是 ViewState 保留这些属性,就像它们在上次呈现表单时一样。
一个很好的例子是SelectedIndexChanged
下拉事件(没有设置自动回发)。这是因为 ViewState 保留了以前的索引,而表单发布了当前索引,并且控件比较两者以知道所选索引已更改。那是它引发SelectedIndexChanged
事件的时候。如果没有 ViewState,该事件将不会触发。事件TextChanged
等也是如此。
如果没有 GET 情况(我从未遇到过),ViewState 的最大问题是在不需要的地方使用它。您的网格控件不需要在其所有行中保留所有控件的先前值,因此不要在其上启用 ViewState。