Если я создам UserControl и добавлю к нему несколько объектов, как я могу получить HTML-код, который он будет отображать?
бывший.
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
Я хотел бы просто преобразовать недавно созданный UserControl в строку HTML.
Вам также необходимо убедиться, что System.Web добавлен в ваши ссылки, чтобы вы могли импортировать System.Web.UI (который нужен HtmlTextWriter)





Вызовите его метод .RenderControl().
Вы можете визуализировать элемент управления с помощью Control.RenderControl(HtmlTextWriter).
Подайте StringWriter в HtmlTextWriter.
Подайте StringBuilder в StringWriter.
Созданная вами строка будет внутри объекта StringBuilder.
Вот пример кода для этого решения:
string html = String.Empty;
using (TextWriter myTextWriter = new StringWriter(new StringBuilder()))
{
using (HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter))
{
myControl.RenderControl(myWriter);
html = myTextWriter.ToString();
}
}
вы также можете добавить элемент управления в коллекцию «живых» элементов управления, чтобы избежать случайных исключений.
Этот ответ можно значительно улучшить, просто разместив здесь образец кода с реальным кодом.
@theJerm: здесь? где? Не вижу ссылки
Экземпляры StringWriter и HtmlTextWriter не удаляются должным образом. Оберните их в блок using.
переопределить метод RenderControl
protected override void Render(HtmlTextWriter output)
{
output.Write("<br>Message from Control : " + Message);
output.Write("Showing Custom controls created in reverse" +
"order");
// Render Controls.
RenderChildren(output);
}
Это даст вам доступ к автору, которому будет написан HTML.
Вы также можете изучить архитектуру адаптивного управления asp.net. адаптивная архитектура управления asp.net, где вы можете «формировать» HTML-вывод по умолчанию из элементов управления.
//render control to string
StringBuilder b = new StringBuilder();
HtmlTextWriter h = new HtmlTextWriter(new StringWriter(b));
this.LoadControl("~/path_to_control.ascx").RenderControl(h);
string controlAsString = b.ToString();
Как поместить сюда свойства usercontrol. Выложите пожалуйста здесь stackoverflow.com/questions/20491018/…
UserControl uc = new UserControl();
MyCustomUserControl mu = (MyCustomUserControl)uc.LoadControl("~/Controls/MyCustomUserControl.ascx");
TextWriter tw = new StringWriter();
HtmlTextWriter hw = new HtmlTextWriter(tw);
mu.RenderControl(hw);
return tw.ToString();
LoadControl решил мою проблему. (создание нового экземпляра не работает)
С опозданием на семь лет, но это заслуживает того, чтобы поделиться.
Общепринятое решение - StringBuilder в StringWriter в HtmlWriter в RenderControl - это хорошо. Но есть некоторые ошибки, с которыми я, к сожалению, столкнулся, пытаясь сделать то же самое. Некоторые элементы управления будут выдавать ошибки, если они не находятся внутри Page, а некоторые будут выдавать ошибки, если они не внутри <form> с runat = "server". Элемент управления ScriptManager демонстрирует оба этих поведения.
В конце концов я нашел здесь обходной путь. Суть его в том, чтобы просто создать экземпляр новой страницы и формы перед тем, как приступить к работе писателя:
Page page = new Page();
page.EnableEventValidation = false;
HtmlForm form = new HtmlForm();
form.Name = "form1";
page.Controls.Add(form1);
MyControl mc = new MyControl();
form.Controls.Add(mc);
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
HtmlTextWriter writer = new HtmlTextWriter(sw);
page.RenderControl(writer);
return sb.ToString();
К сожалению, это дает вам больше разметки, чем вам действительно нужно (поскольку она включает фиктивную форму). И ScriptManager все равно не сработает по какой-то загадочной причине, которую я еще не понял. Честно говоря, это много хлопот, и делать это не стоит; весь смысл создания элементов управления в коде программной части состоит в том, чтобы вам не пришлось возиться с разметкой, в конце концов.
Совершенно верно - спасибо, Рейким. Другая часть этих подходов, которая меня беспокоит, - это количество экземпляров, которое может потребоваться. Меня беспокоят накладные расходы - все для того, чтобы вернуть строку в браузер.
Вы можете использовать метод HttpServerUtility.Execute, доступный через HttpContext.Current.Server.Execute:
var page = new Page();
var myControl = (MyControl)page.LoadControl("mycontrol.ascx");
myControl.SetSomeProperty = true;
page.Controls.Add(myControl);
var sw = new StringWriter();
HttpContext.Current.Server.Execute(page, sw, preserveForm: false);
Преимущество состоит в том, что вы также запускаете событие Page_Load вашего пользовательского элемента управления.
Документацию MSDN можно найти здесь: https://msdn.microsoft.com/en-us/library/fb04e8f7(v=vs.110).aspx.
Пожалуйста, сделайте ответ azamsharp «принятым», если его решение вам подходит. Будь хорошим участником SO :)