2012-03-27 41 views
0

我有一個巨大的viewstate隱藏字段,導致我的應用程序無法工作。我曾嘗試:無法刪除視圖狀態隱藏字段

  • EnableViewState="false"在頁面指令中的每個控制
  • EnableViewState="false"
  • Page.EnableViewState = falsePage_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> 
+0

你有沒有嘗試在頁面的渲染事件剝離出來? http://stackoverflow.com/questions/2432972/completely-remove-viewstate-for-specific-pages – KodeKreachor 2012-03-27 01:55:46

+0

@KodeKreachor我還沒有訴諸於(尚未),它似乎是一個巨大的kludge。這個作者說:「這樣做的開銷幾乎肯定會超過任何可能的好處,儘管」_我將不得不同意:( – Flash 2012-03-27 01:58:49

+0

:)是的,你的選擇是相當有限的,這是ASP.NET的本質。這就是爲什麼我成爲MVC的忠實粉絲,它是一個強大的框架,它提供了輕量級的渲染,沒有臃腫的標記,只有你需要。 – KodeKreachor 2012-03-27 02:05:10

回答

0

如果任何人有類似的問題,它是存在的,因爲我有網格的每行內一個ListView。我用Repeater替換了ListView,視圖狀態不再是問題。

1

你在頁面上看到的隱藏字段不僅是ViewState中,它也包含了ControlState-。沒有辦法禁用控制狀態,所以你需要找到一種方法來處理它。網格顯示多少項目?

作爲最後一個選項,您可以考慮壓縮生成的viewstate字段。

Here你有一個MSDN文章解釋了ControlState-如何工作

+0

網格顯示了很多項目,問題越嚴重,越多。這似乎是因爲我已經在每行的最後一個單元格內的ListView而發生。 – Flash 2012-03-27 02:26:39

1

如果您GridView是非交互的(也就是說,它不包含回發任何子控件),那麼你就可以減少尺寸來看通過等待,直至頁面的Render方法狀態被稱爲以網格綁定:

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

另一種選擇是使用Flesk.ViewState的東西。

它可以把視圖狀態上的文件,壓縮它,會話等

像別人說的,有時候是不可避免的ASPNET一起生活的ViewState。

這就是爲什麼你最好的選擇是遷移到MVC :)