У меня есть какой-либо элемент управления ASP.NET. Я хочу, чтобы строка HTML, как я могу получить строку HTML элемента управления?ASP.NET как визуализировать элемент управления HTML?
26
A
ответ
39
Это, как представляется, работает.
public string RenderControlToHtml(Control ControlToRender)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
System.IO.StringWriter stWriter = new System.IO.StringWriter(sb);
System.Web.UI.HtmlTextWriter htmlWriter = new System.Web.UI.HtmlTextWriter(stWriter);
ControlToRender.RenderControl(htmlWriter);
return sb.ToString();
}
6
Если элемент управления является пользовательский элемент управления веб, это, как вы можете получить в HTML, он излучает с другой страницы или обработчика:
public void GetHtmlFromMySweetControl(HttpContext context)
{
HttpRequest httpRequest = context.Request;
HttpResponse httpResponse = context.Response;
string foo = httpRequest["foo"];
Page pageHolder = new Page();
string path = "~/usercontrols/MySweetControl.ascx";
MySweetControl ctrl = (MySweetControl)pageHolder.LoadControl(path);
ctrl.BindProducts(foo);
pageHolder.Controls.Add(ctrl);
StringWriter sw = new StringWriter();
context.Server.Execute(pageHolder, sw, false);
httpResponse.Write(sw.ToString());
}
6
Принимается ответ на David Basarab
не будет работать, если управление не является частью страницы. a7drew
ответ кажется излишним комплексом - нет необходимости в Context
или Server.Execute
.
private string RenderControl()
{
var sb = new System.Text.StringBuilder();
using (var stWriter = new System.IO.StringWriter(sb))
using (var htmlWriter = new HtmlTextWriter(stWriter))
{
var p = new Page();
var ctrl = (YourControl)p.LoadControl("~/controls/building blocks/YourControl.ascx");
ctrl.Visible = true;
// do your own init logic if needed
p.Controls.Add(ctrl);
ctrl.RenderControl(htmlWriter);
return sb.ToString();
}
}
В StringWriter и HtmlTextWriter реализованы IDisposable, поэтому вы можете их обернуть в блок using() {}. Кроме того, может быть полезно сделать этот метод расширения «Control», поэтому вы можете вызвать его из члена экземпляра. – 2012-11-09 15:44:42
@David, как вы в конечном итоге визуализировали ascx-файл в html? Я пробовал метод выше, но всегда получаю «Ссылка на объект не установлена на экземпляр объекта». Говоря, что пользовательский элемент управления, на который я ссылаюсь, не является экземпляром. Как мы должны использовать его в форме окна или консольном приложении? – Princa 2013-04-30 19:28:53
Конструктор StringWriter() по умолчанию создает новый строковый построитель, поэтому первые две строки могут быть заменены просто System.IO.StringWriter stWriter = new System.IO.StringWriter(); – Spongeboy 2014-04-09 00:53:26