어떤 혜택이 있을 사용하여 HtmlTextWriter 지 않을 경우의 혜택을 적응 렌더링?
-
05-09-2019 - |
문제
외부에서 혜택을 적응적 연출을 위해 다른 장치,아무것도 할 수 없다를 쓰는 이 모든 코드:
writer.WriteBeginTag("table");
writer.WriteBeginTag("tr");
writer.WriteBeginTag("td");
writer.Write(HtmlTextWriter.TagRightChar);
writer.WriteEncodedText(someTextVariable);
writer.WriteEndTag("td");
writer.WriteEndTag("tr");
writer.WriteEndTag("table");
때 StringBuilder 를 구축할 수 있는 동일한 것과 단순히 이:
sb.Append("<table><tr><td>");
sb.Append(someTextVariable);
sb.Append("</td></tr></table>");
해결책
htmltextwriter를 사용해야하는 두 가지 이유를 생각할 수 있습니다.
작가를 사용하여 계약을 추적하여 출력 된 HTML이 한 줄에 나타나지 않고 멋지게 형식화되도록합니다.
htmltextwriter는 일반적으로 출력 스트림과 관련이 있으므로 메모리에 긴 문자열을 구축하는 것보다 더 효율적이어야합니다 (생성하는 HTML의 양에 따라).
이들 중 어느 것도 특별한 이유는 아니지만 효율성이 필요할 때 작가를 사용하도록 설득하거나 재사용 될 기본 제어를 작성하고 가능한 한 전문적이어야하는 기본 제어를 작성하는 경우 충분합니다. 귀하의 마일리지가 다를 수 있습니다 :-).
다른 팁
또 다른 장점은 htmltextwriter를 사용하여 클리너 (더 유지 보수 친화적) 방식으로 코드를 포맷 할 수 있으며 HTMLTextWriter는 HTML을 자동으로 인코딩하는 것을 지원한다는 것입니다. 비교하다:
writer.AddAttribute(HtmlTextWriterAttribute.Id, "someId");
if (!string.IsNullOrEmpty(cssClass)) writer.AddAttribute(HtmlTextWriterAttribute.Class, cssClass);
writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.WriteEncodedText(text);
writer.RenderEndTag();
대:
StringBuilder html = new StringBuilder();
html.Append("<span");
html.Append(" id=\"someId\"");
if (!string.IsNullOrEmpty(cssClass)) html.AppendFormat(" class=\"{0}\"", HttpUtility.HtmlAttributeEncode(cssClass));
html.Append(">");
html.Append(HttpUtility.HtmlEncode(text));
html.Append("</span>");
두 번째 예제의 코드는 다른 클리너의 방식으로 작성 될 수 있다고 주장 할 수 있지만, 이는 기본적으로 하나의 정식 형식 형식의 형식 (다시 유지 보수를 향상됨)을 시행하기 때문에 HTMLTextWriter의 장점으로 볼 수 있습니다.
편집하다: 사실, 나는 실제로 두 번째 스 니펫에서 실수를 저지르고 돌아가서 응답을 수정해야했습니다. 이것은 내가 만들고 싶은 요점을 확인합니다.
htmltextwriter는 다음과 같이 유익합니다.
htmltextwriter는 가장 깨끗하고 마크 업은 렌더링 될 때 잘 들여 쓰기됩니다.
HTMLTextWriter가 출력 스트림에 직접 글을 쓰면서 성능 영향이 있습니다. StringBuilder는 Tostring이 호출 될 때까지 출력 스트림에 쓰지 않습니다.
왜 htmltextwriter를 사용하는지에 대한 예가 있습니다. HTML 출력 저장 및 재사용 여기에도.
어떤 시점에서,당신은 여전히 전달해야이 HtmlTextWriter 를 렌더링하기 위하여 클라이언트입니다.나는 당신이 작가입니다.쓰(sb.ToString());에 있는 두 번째 예에서.무엇을 할 수 있을 줄이는 라인의 코드 작성 raw HTML,정확히 동일한 방식으로에서 당신의 두 번째 StringBuilder 를 들어,사용 HtmlTextWriter.쓰고 대신 합니다.
writer.Write("<table><tr><td>");
writer.Write(someTextVariable);
writer.Write("</td></tr></table>");
다음 사용하 StringBuilder 보이 불필요합니다.고,HtmlTextWriter 것,적어도 어느 정도인지 확인 생성된 HTML 준수(지는 않지만 사실에는 위의 경우를 작성하는 경우,HTML).
내가 생각할 수있는 가장 큰 이유는 입력을 소독하기 위해 추가 단계를 밟지 않아도되기 때문입니다. 문서에 따르면 WriteEncodedText
각도 브래킷을 적절하게 자동으로 포맷합니다.
XSS 진짜 일이며, 향후 개발자가 코드를 유지하기가 더 쉽게 만들 수 있도록 할 수있는 모든 것이 이점입니다.