Можете ли вы добавить дочерние элементы управления в HtmlGenericControl?
У меня очень простая операция, когда я пытаюсь добавить 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'}
Я не могу понять, почему это происходит, поскольку вы должны иметь возможность добавлять элементы управления друг к другу таким образом.
Обратите внимание, что из первого ответа я попытался снова с идентификаторами, но он все еще не работает:
![enter image description here]()
У меня есть дополнительная информация.
При использовании элемента управления Placeholder в качестве родителя исключение не существует:
protected void Page_Init()
{
PlaceHolder ph = new PlaceHolder();
HtmlGenericControl p = new HtmlGenericControl("p");
ph.Controls.Add(p);//no problem
}
Ответы
Ответ 1
"Исключение выбрано только в отладчике - сама страница отображает как будто ничего не случилось".
То, что InnerText не работает, если есть дочерние элементы управления; то есть по дизайну, потому что он не хочет отображать всю иерархию элементов управления в то время для различных характеристик производительности, жизненного цикла и побочных эффектов.
"... что-то определенно происходит, как в большей части кода, элементы управления не отображаются так, как должны".
Что это значит? Что неправильно отображается в "большей части" кода? Я предполагаю, что это проблема где-то еще и не связана с тем, что у вас есть в вашем вопросе здесь.
Итак, я думаю, что все в порядке. Игнорируйте исключение в InnerText в родительском элементе управления. Вам нужно задать новый Вопрос относительно любой проблемы, с которой вы сталкиваетесь с "большей частью" вашего кода.
Ответ 2
Я думаю, что простым решением избежать этой ошибки может быть преобразование дочернего 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;
Ответ 3
вам нужно сначала использовать панель. то вы можете создать дочерний 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);
Ответ 4
Я ошибаюсь, см. комментарий Джона Адамса.
Я подозреваю, что это имеет какое-то отношение к элементам управления, у которых нет установленных идентификаторов. Я мог ошибаться... но вот как установить идентификаторы, если это проблема.
HtmlGenericControl и id
Забастовкa >
Ответ 5
Просто мое небольшое предположение:
protected void Page_Load (отправитель объекта, EventArgs e) {
HtmlGenericControl div = new HtmlGenericControl ( "div" );
div.InnerText = ";
HtmlGenericControl p = new HtmlGenericControl (" p");
div.Controls.Add(p);//возникает исключение}
Ответ 6
Я просто сделал небольшое исследование 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.. не совсем уверен в этом... Я собираюсь снова отредактировать мой ответ позже.
Ответ 7
Если вы попытаетесь сделать это
string text = div.InnerText;
вы получите следующее исключение
Не удается получить внутренний контент id1, потому что содержимое не является литералом.
который сообщает, что вы не можете увидеть сгенерированный html таким образом.
Ответ 8
вы можете
создайте asp: Panel и получим как div точно и добавьте все элементы управления, которые вы хотите внутри него
или
div.InnerHtml + = p.InnerHtml
это добавит ваш рендеринг html p в div