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




user-controls render-html (6)

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

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

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

ех.

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

// ...something happens

return strHTMLofControl;

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


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();

Вызовите его .RenderControl() .


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


Вы можете визуализировать элемент управления с помощью Control.RenderControl(HtmlTextWriter) .

StringWriter в HtmlTextWriter .

StringWriter в 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();




render-html