Как получить HTML-вывод UserControl в .NET (C #)? - PullRequest
48 голосов
/ 14 ноября 2008

Если я создаю UserControl и добавляю в него несколько объектов, как я могу получить HTML, который он будет отображать?

ех.

UserControl myControl = new UserControl();
myControl.Controls.Add(new TextBox());

// ...something happens

return strHTMLofControl;

Я хотел бы просто преобразовать недавно созданный UserControl в строку HTML.

Ответы [ 7 ]

56 голосов
/ 14 ноября 2008

Вы можете отобразить элемент управления, используя 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();
32 голосов
/ 07 мая 2009
//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();
14 голосов
/ 24 января 2011
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();
8 голосов
/ 25 июля 2015

Семь лет спустя, но это заслуживает того, чтобы им поделиться.

Общепринятое решение - 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 все равно потерпит неудачу по какой-то загадочной причине, которую я еще не разгадал. Честно говоря, это много проблем и не стоит делать; весь смысл генерации элементов управления в выделенном коде заключается в том, что вам, в конце концов, не нужно возиться с разметкой.

4 голосов
/ 14 ноября 2008

переопределить метод 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 по умолчанию из элементов управления.

1 голос
/ 01 февраля 2017

Вы можете использовать метод 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.

1 голос
/ 14 ноября 2008

Назовите это .RenderControl() метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...