为什么我的HTML表行在向此表动态添加行后会丢失视图状态?

时间:2018-06-11 13:58:14

标签: asp.net webforms viewstate

我有一个像这样的简单HTML表:

<table id="table" runat="server">
    <tr>
        <td>
            <asp:Label runat="server" Text="Column1" />
        </td>
    </tr>
    <tr id="tr_someId" runat="server">
        <td>
            <asp:Label ID="lb_someId" runat="server" />
        </td>
    </tr>
</table>

在每个请求中,我在(rowIdx = 1)之间添加动态行,如现有行:

protected override void OnLoad( EventArgs e )
{
    base.OnLoad( e );

    if( !IsPostBack )
    {
        lb_someId.Text = "Some text";
    }

    int rowIdx = 1;

    foreach( ISomething something in GetSomethings() )
    {
        HtmlTableRow tr = new HtmlTableRow();
        tr.Cells.Add( CreateLabelCell( something ) );

        table.Rows.Insert( rowIdx++, tr );
    }
}

现在,我想知道为什么我的lb_someId-Label在PostBack上丢失了它的文字?我认为它不应该发生,因为它是一个固定的控制。当我评论table.Rows.Insert( rowIdx++, tr );行时,它不会丢失文本。

提前谢谢!

1 个答案:

答案 0 :(得分:0)

标签值丢失的原因是因为它是OnLoad事件中添加新行的表的一部分。在生命周期的这一点上,动态添加的控件不再被跟踪。该表跟踪其整个视图状态,包括有关标签的一些信息。如果标签在桌子外面,那就不会有问题了。请参阅MSDN: Understanding ASP.NET View State

将代码移至OnInit

protected override void OnInit(EventArgs e)
{   
    base.OnInit(e);

    if( !IsPostBack )
    {
        lb_someId.Text = "Some text";
    }

    int rowIdx = 1;

    foreach( ISomething something in GetSomethings() )
    {
        HtmlTableRow tr = new HtmlTableRow();
        tr.Cells.Add( CreateLabelCell( something ) );

        table.Rows.Insert( rowIdx++, tr );
    }
}

另外,仅将foreach循环移动到OnInit就足够了。

protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);

    if( !IsPostBack )
    {
        lb_someId.Text = "Some text";
    }
}

protected override void OnInit(EventArgs e)
{   
    base.OnInit(e);

    int rowIdx = 1;

    foreach( ISomething something in GetSomethings() )
    {
        HtmlTableRow tr = new HtmlTableRow();
        tr.Cells.Add( new HtmlTableCell { InnerText = something } );

        table.Rows.Insert( rowIdx++, tr );
    } 
}