无法删除viewstate隐藏字段

时间:2012-03-27 01:46:13

标签: asp.net vb.net webforms asp.net-3.5 viewstate

我有一个庞大的viewstate隐藏字段导致我的应用程序无法工作。我试过了:

    每个控件
  • EnableViewState="false"
  • 页面指​​令中的
  • EnableViewState="false"Page.EnableViewState = false
  • Page_Init
  • <pages enableViewState="false" /> in web.config

导致问题的页面有一个GridView,我想只渲染一次,所以我不需要视图状态。

我使用this tool检查了隐藏字段,并且显然几乎没有任何信息(因为我可能在每个控件中都禁用了该属性)。但出于某种原因,该页面坚持要包含一个长达数千行的隐藏字段。

如何摆脱这个领域(或将其减少到可用的大小)?


这是违规的GridView:

<asp:GridView ID="MyGrid" runat="server" AutoGenerateColumns="False" 
      EnableModelValidation="True" EnableViewState="False" 
      CssClass="my-report">
      <Columns>
          <asp:TemplateField>
              <HeaderTemplate>
                <span title='title' class="abbr">My ID</span>
              </HeaderTemplate>
              <ItemTemplate>
                <%# Eval("my_id") %>
              </ItemTemplate>
          </asp:TemplateField>
          <asp:TemplateField>
              <HeaderTemplate>
                <span title='title2' class="abbr">Second col heading</span>
              </HeaderTemplate>
              <ItemTemplate>
                  <asp:ListView ID="MyListView" runat="server" EnableViewState="False">
                     <LayoutTemplate>
                        <ul>
                            <asp:PlaceHolder runat="server" ID="itemPlaceHolder" EnableViewState="False" />
                        </ul>
                     </LayoutTemplate>
                     <ItemTemplate>
                            <li><%# Eval("field_2")%></li>
                     </ItemTemplate>
                   </asp:ListView>
              </ItemTemplate>
          </asp:TemplateField>
      </Columns>
  </asp:GridView>

4 个答案:

答案 0 :(得分:1)

您在页面上看到的隐藏字段不仅适用于ViewState,还包含ControlState。无法禁用控件状态,因此您需要找到一种方法来使用它。网格显示的项目数量是多少?

作为最后一个选项,您可以考虑压缩生成的视图状态字段。

Here您有一篇MSDN文章,解释了ControlState的工作原理

答案 1 :(得分:1)

如果您的GridView是非交互式的(也就是说,它不包含任何回发的子控件),那么您可以通过等到页面的Render来缩小视图状态的大小。调用方法来绑定网格:

Protected Overrides Sub Render(writer As HtmlTextWriter)
    MyGrid.DataSource = ...
    MyGrid.DataBind()
    MyBase.Render(writer)
End Sub

答案 2 :(得分:0)

如果有人遇到类似的问题,那就是因为我在网格的每一行中都有一个ListView。我用Repeater替换了ListView,并且viewstate不再是问题。

答案 3 :(得分:0)

另一种选择是使用Flesk.ViewState。

它可以将视图状态放在文件上,压缩它,会话等。

与其他人一样,有时在ASPNET中与ViewState一起生活是不可避免的。

这就是为什么你最好的选择是转向MVC:)