답변:
ASP.NET 4에는 새로운 코드 너깃 구문이 도입되었습니다 <%: %>
. 기본적으로로 <%: foo %>
번역됩니다 <%= HttpUtility.HtmlEncode(foo) %>
. 이 팀은 XSS를 방지하기 위해 가능한 <%: %>
한 <%= %>
어디에서나 개발자가 사용하도록 노력하고 있습니다.
그러나 이는 코드 너깃이 이미 결과를 인코딩하는 경우 <%: %>
구문이 결과 를 다시 인코딩 한다는 문제를 야기 합니다. 이것은 IHtmlString 인터페이스 (.NET 4의 새로운 기능)의 도입으로 해결됩니다. 경우 foo는 () 에서 <%: foo() %>
다시 표시 IHtmlString는 <%: %>
구문을 다시 인코딩되지 않습니다.
MVC 2의 도우미는 ASP.NET 4에서 IHtmlString 인터페이스를 구현하는 MvcHtmlString을 반환합니다. 따라서 개발자 <%: Html.*() %>
가 ASP.NET 4에서 사용하면 결과가 이중으로 인코딩되지 않습니다.
편집하다:
이 새로운 구문의 즉각적인 이점은 뷰가 약간 더 깨끗하다는 것입니다. 예를 들어 <%: ViewData["anything"] %>
대신 대신 쓸 수 있습니다 <%= Html.Encode(ViewData["anything"]) %>
.
MvcHtmlString.Create
메소드는 사용 가능한지 여부를 감지 IHtmlString
하고 다음과 같은 경우 그것을 지원하기 위해 반환 된 클래스를 동적으로 생성합니다 : windowsitpro.com/article/net-framework/Encoding-and-Strings/…
이것은 늦은 답변이지만이 질문을 읽는 사람이 면도기를 사용하는 경우 면도기가 기본적으로 모든 것을 인코딩 하지만 MvcHtmlString
HTML 도우미에서 사용 하면 면도기가 그것을 인코딩 할 필요가 없다고 말할 수 있습니다 .
면도기가 문자열을 인코딩하지 않게하려면
@Html.Raw("<span>hi</span>")
Raw ()를 디 컴파일하면 문자열을 HtmlString에 래핑하고 있음을 보여줍니다.
public IHtmlString Raw(string value) {
return new HtmlString(value);
}
" HtmlString은 ASP.NET 4에만 존재합니다.
MvcHtmlString은 .NET 3.5와 .NET 4를 모두 지원하기 위해 MVC 2에 추가 된 호환성 shim입니다. 이제 MVC 3은 .NET 4 전용이므로 소스 호환성을 위해 MVC 2-> 3에 대한 HtmlString의 상당히 작은 하위 클래스입니다. " 소스
이것을 실제로 사용하는 것은 자신 만의 HtmlHelper
확장 을 만들고 싶을 때 입니다. 예를 들어 <link>
태그 구문 을 기억하는 것을 싫어 하므로 <link>
태그 를 만들기 위해 자체 확장 방법을 만들었습니다 .
<Extension()> _
Public Function CssBlock(ByVal html As HtmlHelper, ByVal src As String, ByVal Optional ByVal htmlAttributes As Object = Nothing) As MvcHtmlString
Dim tag = New TagBuilder("link")
tag.MergeAttribute("type", "text/css")
tag.MergeAttribute("rel", "stylesheet")
tag.MergeAttribute("href", src)
tag.MergeAttributes(New RouteValueDictionary(htmlAttributes))
Dim result = tag.ToString(TagRenderMode.Normal)
Return MvcHtmlString.Create(result)
End Function
String
이 방법에서 돌아 왔을 수 있지만 다음과 같은 경우 중단됩니다.
<%: Html.CssBlock(Url.Content("~/sytles/mysite.css")) %>
와 MvcHtmlString
, 중 사용 <%: ... %>
또는 <%= ... %>
제대로 것 모두 일을.
MvcHtmlString
원시 HTML을 MVC 헬퍼 메소드에 전달하고 헬퍼 메소드가 HTML을 인코딩하지 않도록 하려면 if를 사용합니다 .
MvcHtmlString
습니까?
MvcHtmlString
구현하지 않는IHtmlString
그에만 4에 존재하기 때문에<%:
구문 필수의 오리 형 - 항상 호출.ToHtmlString()
하기 전에.ToString()
상관없이 인터페이스.