2010-08-04 5 views
3

HtmlTextWriter이 UI 요소를 렌더링하는 데 광범위하게 사용되는 일부 이전 코드를 마이그레이션하려고합니다.ASP.NET MVC에서 HtmlTextWriter 사용

ASP.NET MVC 1.0을 사용하도록 코드를 마이그레이션하고 있습니다. 내가 아는 한, 들여 쓰기와 같은 특정 기능 (HtmlTextWriter)을 사용하고 있지 않습니다.

현재, 나는 다음과 같은 HtmlTextWriter에 의해 생성 된 문자열을 반환하는 래퍼 방법을 사용하고 있습니다 :

var sw = new StringWriter(); 
var xhtmlTextWriter = new XhtmlTextWriter(sw); 
GenerateHtml(xhtmlTextWriter); 
return sw.ToString(); 

내 질문은 : 나는 ASP에서 HtmlTextWriter 인스턴스를 얻기 위해 노력하고

  1. . NET MVC보기,하지만 분명히 심지어 HtmlHelper이 사용하지 않습니다. 나는 무엇이든 놓친다?

  2. GenerateHtml을 호출 할 때마다 일반적으로 1000자를 초과하지 않는 작은 HTML 조각이 생성되지만 많은 호출이있을 수 있습니다. HtmlTextWriter 종속 코드를 StringBuilder로 다시 작성할 가치가 있습니까? 또는 모든 호출에 사용되며 반복 끝에 플러시되는 HtmlTextWriter 인스턴스를 만드는 방법은 무엇입니까?

답변

0

여기에 MVC 앱에서 이것을 수행하는 방법을 보여주는 a demo app이 있습니다.

다음은 해당 게시물의 코드 샘플입니다.

public static string DayPilot(
     this HtmlHelper helper, 
     DayPilotData model, 
     DayPilotViewOptions options) 
    { 
     var calendar = new DayPilotCalendar(); 
     if (model != null) 
     { 
      model.CopyTo(calendar); 
     } 
     if (options != null) 
     { 
      options.CopyTo(calendar); 
     } 
     var sb = new System.Text.StringBuilder(); 
     sb.Append("<div class=\"dayPilot\">"); // allows working around td cellpadding bug in css 
     using (var sw = new System.IO.StringWriter(sb)) 
     { 
      using (var tw = new HtmlTextWriter(sw)) 
      { 
       calendar.RenderControl(tw); 
      } 
     } 
     sb.Append("</div>"); 
     return sb.ToString(); 
    } 

이 파산하지 않는 경우 ...,

+0

... 수정하지 마세요. 예,하지만 내 주요 관심사는 코드가 HtmlTextWriter가 StringWriter/StringBuilder가 아닌 스트림에 의해 지원된다고 가정한다는 것입니다. 다른 백엔드를 사용하면 성능에 심각한 영향을 미칠 수 있으며 최종 사용자가 "손상된"것으로 인식 될 수 있습니다. –

+1

프로파일 링에서 실제로 병목 현상이 발생한 것으로 확인되면 문제를 해결하십시오. –

4

을 # 2에 대해서는 대신 내가 작동합니다 helper.ViewContext.writer를 사용하여 생각 StringBuider 및 StringWriter를 작성.

그런 다음 위의 샘플 코드는 다음과 같습니다

var calendar = new DayPilotCalendar(); 
if(model != null) 
    { 
    model.CopyTo(calendar); 
    } 
if(options != null) 
    { 
    options.CopyTo(calendar); 
    } 

HtmlTextWriter writer = new HtmlTextWriter(helper.ViewContext.Writer); 

writer.AddAttribute(HtmlTextWriterAttribute.Class, "dayPilot"); 
writer.RenderBeginTag(HtmlTextWriterTag.Div); 
calendar.RenderControl(writer); 
writer.RenderEndTag(); // Close DIV 

return(null);   // Don't need to return anything. 

면책 조항 : 지금까지 내가 단지 <UL> 목록을 생성하는 helper.ViewContext.Writer를 사용하여 시도했습니다. 괜찮 았어. 컨트롤 렌더링을 시도하지 않았습니다.

+0

슬프게도 ViewContext.Writer 속성은 ASP.NET MVC 2.0에서만 사용할 수 있습니다. 정보를 가져 주셔서 감사합니다. –

관련 문제