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



我有一个简单的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在回发中丢失了文本?我认为它不应该发生,因为它是一个固定的控制。当我注释掉table.Rows.Insert( rowIdx++, tr );行时,它不会丢失其文本。

提前谢谢你!

标签值丢失的原因是因为它是表的一部分,OnLoad事件中将向其添加新行。在生命周期的此时,不再跟踪动态添加的控件。该表跟踪其整个视图状态,包括有关标签的一些信息。如果标签在表之外,就不会有问题。请参阅 MSDN:了解视图状态 ASP.NET。

将代码移动到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 );
} 
}

最新更新