从C#代码隐藏错误创建ASP.NET控件

本文关键字:ASP NET 控件 创建 错误 代码 隐藏 | 更新日期: 2023-09-27 18:27:03

请考虑以下事项:

代码背后:

public void InitiateTable() 
{
    Controls.Add(new LiteralControl("<table class='"table table-invoice'" >")); //Line that gave me error
    ...
    Controls.Add(new LiteralControl("</table>"));
}

在我的ASP.Net页面上:

<% InitiateTable(); %>

当我运行代码时,它会给我一个错误,说:

The Controls collection cannot be modified because the control contains code blocks (i.e. <% ... %>).

有人能解释一下我做错了什么吗?非常感谢。

从C#代码隐藏错误创建ASP.NET控件

注意:按照注释中的建议,将LiteralControl更改为Control。

不能修改容器中包含<%%>的控件集合错误消息告诉您的代码块。Controls.Add将修改控件集合。绕过这个:

在您的aspx页面中更改

<% InitiateTable(); %>

<asp:Literal runat="server" id="mytable" />

然后在页面加载方法中,添加对InitiateTable()的调用

然后在你的InitiateTable()方法中,把你的代码改成这样:

public void InitiateTable() 
{
    var literalControlValue = new StringBuilder();
    literalControlValue.Append("<table class='"table table-invoice'" >"); 
    ...
    literalControlValue.Append("</thead>"));
    mytable.Text = literalControlValue.ToString();
}

Controls.Add(new LiteralControl("<table class='table table-invoice'>"));

问题是,当您使用Controls时,您引用的是页面本身,而不是您称之为InitiateTable的区域。

如果你在这个区域插入控件,这就是占位符的作用:

<asp:Placeholder id="phTable"></Placeholder>

然后在您的Page_Load或其他事件代码中:

private void Page_Load(object sender, System.EventArgs e)
{
    phTable.Controls.Add(new LiteralControl("<table class='"table table-invoice'" >"));
    phTable.Add(new LiteralControl("</thead>"));
}