문제

나는 글을 쓰고있다 RenderContents() 내 ASP.NET 서버 제어 방법. 이 방법은 an을 사용합니다 HtmlTextWriter 출력 컨텐츠를 렌더링하는 개체. 내가 쓰고있는 제어를 위해 HtmlTextWriter의 방법은 모든 태그를 열고 닫고 스트림에 모든 속성을 추가하려면 많은 코드 라인이 필요한 것처럼 보입니다. 결국 나는 필요한 것보다 훨씬 더 긴 코드로 끝날 것 같습니다.

나는 내가 StringBuilder, 내 코드는 읽기가 훨씬 더 깨끗하고 쓰기 쉽습니다.

내가 궁금한 점은 HtmlTextWriter 내 컨트롤의 내용을 렌더링하는 개체? 안전 점검 외에 (나는 가정하고 있다고 가정) 여기에는 잘못된 순서로 태그를 쓰지 않거나 잘못된 마크 업을 만들지 않도록하는 것이 포함됩니다. 이유가 없습니다.

다음과 같은 일을하는 것이 더 쉬운 것 같습니다.

protected override void RenderContents(HtmlTextWriter output)
{
    StringBuilder s = new StringBuilder();
    s.Append("lots")
     .Append("of")
     .Append("strings");

    output.BeginRender();
    output.Write(s.ToString());
    output.EndRender();
}

이것이 나쁜 생각이 될 이유가 있습니까?

업데이트
응답으로 Mehrdad Afshari답변 :
나는 별도의 메모리 요구 사항에 대해별로 생각하지 않았다. StringBuilder 인스턴스화 된 물체. 추가 문자열이 만들어지지 않도록 htmltextwriter를위한 래퍼를 만드는 것은 어떻습니까?

public class ChainedHtmlTextWriter
{
    private HtmlTextWriter _W;
    public ChainedHtmlTextWriter(HtmlTextWriter writer)
    {
        _W = writer;
    }

    public ChainedHtmlTextWriter Write<T>(T value) 
    { 
        _W.Write(value); 
        return this; 
    }

    public ChainedHtmlTextWriter WriteLine<T>(T value)
    {
        _W.WriteLine(value);
        return this;
    }
}
도움이 되었습니까?

해결책

나는 개발자들이 당신이 탐험하고있는 끔찍한 길을 따랐던 응용 프로그램에서 일하고 있습니다. 이것은 HTML 코드를 뱉어내는 자신의 Isapi DLL을 작성 해야하는 날로 거슬러 올라갑니다. 코드가 대부분 문자열이라면 문제가 발생합니다.

내가 변경하는이 유형의 대부분의 코드는 서버 개체를 인스턴스화하고 원하는대로 속성을 구성한 다음 .RenderControl (Writer)을 알려줍니다. 이로 인해 코드를 훨씬 쉽게 읽고 작업 할 수 있습니다. 오버 헤드에서 성능이 인한 경우, 나는 그것을 기꺼이 받아들이려고합니다 (사실, 응용 프로그램은 일반적으로 변경을 한 후에도 더 빨리 실행됩니다. 따라서 일화 적으로는 그렇지 않지만 프로파일 링하지 않았습니다. 내 코드).

문자열에서 물건을 하드 코딩하는 것 중 하나의 간단한 단점 중 하나는 HTML 표준이 변경 될 때입니다. 내가 작업하는 코드는 04/05 년에 작성된 이후로 작성되었습니다.u003CBR> 되었습니다u003Cbr /> 대문자 HTML 태그는 더 이상 코셔가 아닙니다. 서버 컨트롤을 사용하고 있다면 해당 서버 컨트롤은 우리가 무엇이든 할 필요없이 출력 된 HTML을 변경했습니다. 이것은 단 하나의 간단한 예일뿐입니다.

편집 : 오, BTW, Beginrender 및 Endrender에는 아무런 구현도 없습니다. 그들은 당신이 당신이 HTMLTextWriter- 파생 클래스에서 사용자 정의 기능을 무시하고 제공 할 수있는 자리 표시 자입니다.

edit2 : 때로는 약간 번거롭습니다 언제나 컨테이너 및 물건에 대해 서버 컨트롤을 사용하십시오. 나는 많은 .controls.add ()를하고 나중에 컨테이너를 렌더링하고 있습니다. 그래서 때때로 나는 이것을한다 :

writer.AddAttribute(HtmlTextWriterAttribute.Class, "myContainerClass");
writer.RenderBeginTag(HtmlTextWriterTag.Div);
// do some stuff, .RenderControl on some other controls, etc.
writer.RenderEndTag();

언급했듯이, 이것은 향후 DIV의 HTML이 변경 되더라도 올바른 HTML을 만들어냅니다. 하드 코딩 된 문자열이 없기 때문입니다.

다른 팁

성능 측면에서는 더 많은 문자열 사본을 수행해야합니다. HtmlTextWriter 출력 버퍼에 직접 씁니다. StringBuilder 반면에, 자체 버퍼가 있습니다. 전화 할 때 ToStringStringBuilder, 새 문자열을 빌드해야하며, 이는 출력 버퍼에 기록됩니다. output.Write. 더 많은 작업을 수행해야합니다.

나는 당신이 Page에 의해 시작된 Teginrender/Endrender를 불러야한다고 생각하지 않습니다.

String Builder를 사용하면 HTMLTextWriters 자신의 방법을 사용하여 작업을 저장하는 방법을 알 수 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top