如何优化GridView生成的ViewState并保留一些与GridView相关的功能

时间:2012-01-18 11:15:54

标签: c# asp.net gridview webforms viewstate

通过跟随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 的任何值。以下是LinkBut​​ton及其事件处理程序的代码:

<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。

那么,当使用带有LinkBut​​tons的GridViews及其事件处理程序时,如何优化ViewState?有没有其他方法可以在代码隐藏中获取CommandArgument值?

非常感谢任何帮助。

2 个答案:

答案 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是包含LinkButtonidnumber的单元格。

答案 1 :(得分:2)

在ASP开发的最后几个月里,我已经看过几次了。我有时在页面上有一个隐藏的文本字段,其中启用了viewstate,然后我有一个控件(Javascript),在选择链接时设置隐藏文本字段的值,然后我可以从后面的代码中访问该值。权衡是你不必在Viewstate中携带GridView,但是你使用隐藏字段和JS使页面变得更加混乱。

祝你好运