从 C# 代码隐藏错误创建 ASP.NET 控件
Posted
技术标签:
【中文标题】从 C# 代码隐藏错误创建 ASP.NET 控件【英文标题】:Creating ASP.NET controls from C# Code Behind error 【发布时间】:2015-12-16 08:55:27 【问题描述】:请考虑以下几点:
后面的代码:
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. <% ... %>).
谁能解释我做错了什么? 谢谢。
【问题讨论】:
"The Controls collection cannot be modified because the control contains code blocks"的可能重复 【参考方案1】:注意按照评论中的建议将 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();
【讨论】:
您好,感谢您的回复,但我收到此错误 `Unknown server tag 'asp:LiteralControl'..` 我能知道为什么会这样吗?提前致谢。 这是因为 LiteralControl 位于 System.Web.UI 命名空间中,而不是像许多其他控件一样位于 System.Web.UI.WebControls 命名空间中。只需在您的 aspx 页面指令中添加适当的标签前缀和 system.web.ui 即可。 应该是asp:Literal
而不是asp:LiteralControl
【参考方案2】:
Controls.Add(new LiteralControl("<table class='table table-invoice'>"));
【讨论】:
【参考方案3】:问题是当您使用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>"));
【讨论】:
以上是关于从 C# 代码隐藏错误创建 ASP.NET 控件的主要内容,如果未能解决你的问题,请参考以下文章
隐藏面板内的 ASP.NET updatepanel 可能存在错误
在 Asp.net C# 中创建动态控件,并缓存控件并绑定数据
ASP.NET 控件无法在 Visual Studio 2008 的代码隐藏中引用