我有一个庞大的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>
答案 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:)