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




user-controls render-html (5)

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

ех.

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

// ...something happens

return strHTMLofControl;

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


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


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

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

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


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





render-html