Как получить HTML-вывод UserControl в .NET(С#)?
Если я создаю UserControl и добавлю к нему некоторые объекты, как я могу захватить HTML-код, который он отобразит?
ех.
UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());
// ...something happens
return strHTMLofControl;
Я хотел бы просто преобразовать недавно созданный UserControl в строку HTML.
Ответы
Ответ 1
Вы можете сделать управление с помощью 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();
Ответ 2
//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();
Ответ 3
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();
Ответ 4
Семь лет опаздывают, но это заслуживает того, чтобы их поделили.
Общепринятое решение - StringBuilder
в StringWriter
в HtmlWriter
в RenderControl
- хорошо. Но есть некоторые gotchas, которые я, к сожалению, сталкивался, пытаясь сделать то же самое. Некоторые элементы управления будут вызывать ошибки, если они не находятся внутри 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 по-прежнему терпит неудачу по какой-то тайной причине, которую я еще не озадачил. Честно говоря, это много неприятностей и не стоит делать; вся точка генерации элементов управления в кодовом замке такова, что в конце концов вам не придется возиться с разметкой.
Ответ 5
переопределить метод 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 по умолчанию из элементов управления.
Ответ 6
Вызов метода .RenderControl()
.
Ответ 7
Вы можете использовать метод 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.