Подтвердить что ты не робот

Как получить HTML-вывод UserControl в .NET(С#)?

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

ех.

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

// ...something happens

return strHTMLofControl;

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

4b9b3361

Ответ 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.