2008-09-12 2 views

ответ

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

В StringWriter и HtmlTextWriter реализованы IDisposable, поэтому вы можете их обернуть в блок using() {}. Кроме того, может быть полезно сделать этот метод расширения «Control», поэтому вы можете вызвать его из члена экземпляра. – 2012-11-09 15:44:42

+1

@David, как вы в конечном итоге визуализировали ascx-файл в html? Я пробовал метод выше, но всегда получаю «Ссылка на объект не установлена ​​на экземпляр объекта». Говоря, что пользовательский элемент управления, на который я ссылаюсь, не является экземпляром. Как мы должны использовать его в форме окна или консольном приложении? – Princa 2013-04-30 19:28:53

+1

Конструктор StringWriter() по умолчанию создает новый строковый построитель, поэтому первые две строки могут быть заменены просто System.IO.StringWriter stWriter = new System.IO.StringWriter(); – Spongeboy 2014-04-09 00:53:26

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