我有一个非常简单的操作,我尝试将HtmlGenericControl添加到另一个HtmlGenericControl:
protected void Page_Load(object sender, EventArgs e)
{
HtmlGenericControl div = new HtmlGenericControl("div");
HtmlGenericControl p = new HtmlGenericControl("p");
div.Controls.Add(p);//exception occurs
}
仅在调试器中抛出异常 - 页面本身呈现为好像什么都没发生。然而,确实发生了一些事情,因为在更大的代码部分中,控件没有按照它们应该进行渲染。
实际例外是:
{InnerText = '((System.Web.UI.HtmlControls.HtmlContainerControl)(div)).InnerText' threw an exception of type 'System.Web.HttpException'}
我无法理解为什么会这样,因为你应该能够以这种方式相互添加控件。
请注意,从第一个答案开始,我再次尝试使用ID,但它仍无效:
我有更多信息。 使用占位符控件作为父级时,没有例外:
protected void Page_Init()
{
PlaceHolder ph = new PlaceHolder();
HtmlGenericControl p = new HtmlGenericControl("p");
ph.Controls.Add(p);//no problem
}
答案 0 :(得分:1)
“仅在调试器中抛出异常 - 页面本身呈现 好像什么也没发生过。“
如果存在子控件,那么InnerText将无效;这是设计因为它不希望在各种性能,生命周期和副作用原因的情况下呈现整个控件层次结构。
“......肯定会发生一些事情,就像代码的大部分一样, 控件没有像它们那样呈现。“
这是什么意思?什么在代码的“较大部分”中呈现错误?我的猜测是,这是其他地方的问题,与你在这里的问题无关。
所以我觉得你很好。忽略父控件上的InnerText中的异常。您需要向代码的“较大部分”询问有关您遇到的任何问题的新问题。
答案 1 :(得分:1)
我认为避免此错误的简单解决方案是将子HtmlGenericControl呈现为字符串,然后将其添加到InnerHtml属性中的父项。像这样的东西:
HtmlGenericControl parent = new HtmlGenericControl("div");
HtmlGenericControl child = new HtmlGenericControl("div");
StringWriter stringWriter = new StringWriter();
HtmlTextWriter twr = new HtmlTextWriter(stringWriter);
child.RenderControl(twr);
string rendered=stringWriter.ToString().Replace("\r","").Replace("\n","").Replace("\t","");
parent.InnerHtml = rendered;
答案 2 :(得分:1)
您需要先使用面板。然后你可以创建子HtmlGenericControl,然后创建父HtmlGenericControl,然后你可以将父控件添加到面板中。例如:
<asp:Panel ID="panel" runat="server" ></asp:Panel>
//parent
HtmlGenericControl div = new HtmlGenericControl("div");
//child
HtmlGenericControl p = new HtmlGenericControl("p");
// adding child control to parent control.
div.Controls.Add(p);
div.Visible = true;
//adding parent control to panel
panel.Controls.Add(div);
答案 3 :(得分:0)
我不对,请参阅Jon Adams的评论。
<击> 我怀疑它与尚未设置ID的控件有关。我可能是错的......但如果这是问题,这里是如何设置ID。
<击> HtmlGenericControl and id 击>
答案 4 :(得分:0)
我的小假设:
protected void Page_Load(object sender,EventArgs e){
HtmlGenericControl div = new HtmlGenericControl(“div”);
div.InnerText =“”;HtmlGenericControl p = new HtmlGenericControl(“p”);
div.Controls.Add(p); //发生异常}
答案 5 :(得分:0)
我刚做了一点MSDN次研究。显然你不允许使用多个HtmlContainerControl。
异常----------条件
HttpException ---有多个HTML服务器控件。
虽然您可以创建多个HtmlContainerControl ......但仍然在研究这个问题。无论如何,执行这段代码时会抛出无异常
try
{
HtmlGenericControl div = new HtmlGenericControl("div");
div.ID = "div1";
HtmlGenericControl p = new HtmlGenericControl("p");
p.ID = "p1";
div.Controls.Add(p);
div.InnerText = "sep";
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
System.Diagnostics.Debug.WriteLine(ex.StackTrace);
}
也许这只是VS的调试器消息..对此不太确定...我将在稍后重新编辑我的答案..
答案 6 :(得分:0)
如果您尝试这样做
string text = div.InnerText;
你会得到下一个例外
无法获取id1的内部内容,因为内容不是文字。
告诉你不能以这种方式看到生成的html。
答案 7 :(得分:0)
创建asp:Panel,它完全呈现为div并添加你想要的所有控件
或
div.InnerHtml + = p.InnerHtml
这会将你的p的渲染html添加到div