你可以将子控件添加到HtmlGenericControl吗?

时间:2011-07-12 05:45:58

标签: asp.net webforms controls

我有一个非常简单的操作,我尝试将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
}

仅在调试器中抛出异常 - 页面本身呈现为好像什么都没发生。然而,确实发生了一些事情,因为在更大的代码部分中,控件没有按照它们应该进行渲染。

enter image description here

实际例外是:

{InnerText = '((System.Web.UI.HtmlControls.HtmlContainerControl)(div)).InnerText' threw an exception of type 'System.Web.HttpException'}

我无法理解为什么会这样,因为你应该能够以这种方式相互添加控件。

请注意,从第一个答案开始,我再次尝试使用ID,但它仍无效:

enter image description here

我有更多信息。 使用占位符控件作为父级时,没有例外:

protected void Page_Init()
{
  PlaceHolder ph = new PlaceHolder();
  HtmlGenericControl p = new HtmlGenericControl("p");

  ph.Controls.Add(p);//no problem
}

8 个答案:

答案 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