Как получить HTML-вывод UserControl в.NET (C#)?
Если я создаю UserControl и добавляю в него некоторые объекты, как я могу получить HTML, который он будет отображать?
ех.
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
Я хотел бы просто преобразовать недавно созданный UserControl в строку HTML.
7 ответов
Вы можете визуализировать элемент управления, используя Control.RenderControl(HtmlTextWriter)
,
Кормить StringWriter
к HtmlTextWriter
,
Кормить StringBuilder
к StringWriter
,
Ваша сгенерированная строка будет внутри StringBuilder
объект.
Вот пример кода для этого решения:
StringBuilder myStringBuilder = new StringBuilder();
TextWriter myTextWriter = new StringWriter(myStringBuilder);
HtmlTextWriter myWriter = new HtmlTextWriter(myTextWriter);
myControl.RenderControl(myWriter);
string html = myTextWriter.ToString();
//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 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();
Семь лет спустя, но это заслуживает того, чтобы им поделиться.
Общепринятое решение - 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 все равно не работает по какой-то непонятной причине, которую я еще не разгадал. Честно говоря, это много проблем и не стоит делать; весь смысл генерации элементов управления в выделенном коде заключается в том, что вам не нужно возиться с разметкой, в конце концов.
Переопределить метод 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 по умолчанию из элементов управления.
Вы могли бы использовать 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.