Как оптимизировать ViewState, сгенерированный GridView, и сохранить некоторые функции, связанные с GridView - PullRequest
4 голосов
/ 18 января 2012

Следуя этому сообщению Я уменьшил размер моего ViewState до 5 раз меньше, чем когда я использовал GridView с полным ViewState.

По сути, это коддля оптимизации 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>

Codebehind:

protected void selectCommand(object sender, CommandEventArgs e)
{
    int numberID = int.Parse(e.CommandArgument.ToString());
    selectCommandInfo(numberID);
}

Поэтому я получаю сообщение об ошибке на стороне сервера, потому что он пытается проанализироватьпустая строка для int.

Итак, как я могу оптимизировать ViewState при использовании GridView с LinkButtons и их обработчиками событий?Есть ли другой способ получить значение CommandArgument в коде?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 15 сентября 2015

Одно простое решение - пойти на один уровень глубже - отключите 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.

2 голосов
/ 18 января 2012

Я видел это пару раз за последние несколько месяцев при разработке в ASP. Иногда у меня есть скрытое текстовое поле на странице, на котором включено viewstate, затем у меня есть элемент управления (Javascript), который устанавливает значение скрытого текстового поля при выборе ссылки, я могу получить доступ к значению из кода , Компромисс в том, что вам не нужно переносить GridView в Viewstate, но затем вы делаете страницу немного запутанной со скрытым полем и JS.

Удачи

...