通过跟随this post,我将ViewState的大小减少了5倍,而不是使用完整ViewState的GridView。
基本上,这是优化ViewState的代码:
public void DisableViewState(GridView dg)
{
foreach (GridViewRow gvr in dg.Rows)
{
gvr.EnableViewState = false;
}
}
private void Page_Load(object sender, System.EventArgs e)
{
if (!Page.IsPostBack)
{
GridView1.DataSource = GetData();
GridView1.DataBind();
DisableViewState(GridView1);
}
}
通过这样做,我仍然可以使用GridView的排序和分页功能。
但是,当在GridView中使用链接时,它的行为与它具有完整ViewState时的行为不同,因为服务器代码没有获得 CommandArgument 的任何值。以下是LinkButton及其事件处理程序的代码:
<ItemTemplate>
<asp:LinkButton CommandArgument='<%#Eval("idnumber")%>' ID="linkSelect" Text="Select"
runat="server" OnCommand="selectCommand"></asp:LinkButton>
</ItemTemplate>
代码隐藏:
protected void selectCommand(object sender, CommandEventArgs e)
{
int numberID = int.Parse(e.CommandArgument.ToString());
selectCommandInfo(numberID);
}
因此,我在服务器端收到错误,因为它试图将空字符串解析为int。
那么,当使用带有LinkButtons的GridViews及其事件处理程序时,如何优化ViewState?有没有其他方法可以在代码隐藏中获取CommandArgument值?
非常感谢任何帮助。
答案 0 :(得分:3)
一个简单的解决方案是更深层次 - 对单元格而不是行禁用ViewState
:
private void gv_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType != DataControlRowType.DataRow)
return;
foreach (TableCell cell in e.Row.Cells)
cell.EnableViewState = false;
e.Row.Cells[0].EnableViewState = true;
e.Row.Cells[1].EnableViewState = true;
}
假设0和1是包含LinkButton
和idnumber
的单元格。
答案 1 :(得分:2)
在ASP开发的最后几个月里,我已经看过几次了。我有时在页面上有一个隐藏的文本字段,其中启用了viewstate,然后我有一个控件(Javascript),在选择链接时设置隐藏文本字段的值,然后我可以从后面的代码中访问该值。权衡是你不必在Viewstate中携带GridView,但是你使用隐藏字段和JS使页面变得更加混乱。
祝你好运