본문 바로가기

ASP.NET

ASP.NET MVC 에서 사용자 정의 컨트롤의 내용을 문자열로 받기

간혹 사용자 정의 컨트롤(.ascx) 파일에서 처리한 내용을 Page에 바로 출력하는 것이 아니라, 문자열로 받아야 할 경우가 있습니다.
ASP.NET 웹 폼의 경우에는 Page.LoadControl() 과 Control.RenderControl() 메서드를 이용하여 아래와 같은 코드로 사용자 정의 컨트롤이 처리한 내용을 문자열로 받아올 수 있습니다.

Control control = LoadControl("~/MailTemplate.ascx");

 

((MailTemplate)control).DestinationName = "Whistle";

 

StringBuilder stringBuilder = new StringBuilder();

using (StringWriter sw = new StringWriter(stringBuilder))

{

    using (HtmlTextWriter tw = new HtmlTextWriter(sw))

    {

        control.RenderControl(tw);

    }

}

 

string messageContent = stringBuilder.ToString();

ASP.NET 웹 폼은 자체가 Page 클래스를 상속받으므로, TemplateControl.LoadControl() 메서드를 사용할 수 있으므로, 사용자 정의 컨트롤을 로드하고 HtmlTextWriter를 이용하여 컨트롤의 실행된 내용을 문자열로 받아 올 수 있습니다.

ASP.NET MVC는 사용자 정의 컨트롤이 ViewUserContol을 상속받게 되며, MVC Controller는 자체적으로 ViewUserControl에 대한 LoadControl을 제공하지 않습니다,
ViewUserControl 클래스의 인스턴스를 생성은 ViewPage 클래스의 인스턴스 상에서만 가능합니다.

즉, MVC에서 사용자 정의 컨트롤이 생성하는 HTML을 문자열로 받기 위해서는, 가상의 ViewPage의 인스턴스를 생성하고, 그 ViewPage를 기반으로 사용자 정의 컨트롤을 생성한 후 ASP.NET 웹 폼에서와 같은 방법으로 문자열을 받아 올 수 있습니다.

ViewData["UserName"] = "Whistle";

 

ViewPage viewPage = new ViewPage() { ViewContext = new ViewContext() };

 

viewPage.ViewData = new ViewDataDictionary(ViewData);

viewPage.Controls.Add(viewPage.LoadControl("~/Views/Shared/MailTemplate.ascx"));

 

StringBuilder sb = new StringBuilder();

using (StringWriter sw = new StringWriter(sb))

{

    using (HtmlTextWriter tw = new HtmlTextWriter(sw))

    {

        viewPage.RenderControl(tw);

    }

}

 

string message = sb.ToString();

위와 같은 형식으로 MVC에서도 사용자 정의 컨트롤의 출력 내용을 문자열로 받아와서 처리가 가능합니다.