MvcHtmlString은 무엇이며 언제 사용해야합니까?


221

문서 에 대한 MvcHtmlString정말 계몽되지 않습니다

다시 인코딩해서는 안되는 HTML 인코딩 문자열을 나타냅니다.

이것이 정확히 무엇을 의미하는지는 분명하지 않습니다. 일부 HTML 도우미 메서드는을 반환하는 것으로 보이지만 MvcHtmlString사용자 정의 도우미 온라인에서 본 몇 가지 예제는 일반 문자열을 반환합니다.

질문 :

무엇입니까 MvcHtmlString?

언제 선택해야합니다 MvcHtmlString이상 string반대와 반대? 왜?

답변:


246

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"]) %>.


내가 MVC이 아닌 4. 닷넷 3.5에 대해이 수단 컴파일 된 것을 추가 할 것 MvcHtmlString구현하지 않는 IHtmlString그에만 4에 존재하기 때문에 <%:구문 필수의 오리 형 - 항상 호출 .ToHtmlString()하기 전에 .ToString()상관없이 인터페이스.
— Keith

2
나는 수정했다-실제로 MvcHtmlString.Create메소드는 사용 가능한지 여부를 감지 IHtmlString하고 다음과 같은 경우 그것을 지원하기 위해 반환 된 클래스를 동적으로 생성합니다 : windowsitpro.com/article/net-framework/Encoding-and-Strings/…
— Keith

후속 조치 : MvcHtmlString과 HtmlString간에 의미있는 차이가 있습니까? 위에 링크 된 문서를 읽은 후에도 여전히 MvcHtmlString이 HtmlString이 제공하지 않는 것이 무엇인지 알지 못했습니다.
— flipdoubt

@flipdoubt-의미있는 차이가 없습니다.
— Levi

2
둘 사이에는 약간의 차이가 있습니다. MvcHtmlString은 null 문자열을 전달하면 ToString () 또는 ToHtmlString ()에 String.Empty를 반환합니다. 그러나 HtmlString은 계속 null을 반환합니다.
— rossisdead

87

이것은 늦은 답변이지만이 질문을 읽는 사람이 면도기를 사용하는 경우 면도기가 기본적으로 모든 것을 인코딩 하지만 MvcHtmlStringHTML 도우미에서 사용 하면 면도기가 그것을 인코딩 할 필요가 없다고 말할 수 있습니다 .

면도기가 문자열을 인코딩하지 않게하려면

@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의 상당히 작은 하위 클래스입니다. " 소스


11

이것을 실제로 사용하는 것은 자신 만의 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, 중 사용 <%: ... %>또는 <%= ... %>제대로 것 모두 일을.


7

MvcHtmlString원시 HTML을 MVC 헬퍼 메소드에 전달하고 헬퍼 메소드가 HTML을 인코딩하지 않도록 하려면 if를 사용합니다 .


흠 ... HTML 도우미 메서드의 요점은 HTML을 인코딩하는 것이라고 생각했습니다. HTML 도우미 메서드로 다른 방법으로 무엇을 할 수 있습니까?
— devuxer

그리고 그 외에도 HTML 도우미 메서드에서 언제 반환 하고 싶 MvcHtmlString습니까?
— devuxer

합격 또는 귀국 HTML 도우미가 미리 이스케이프 된 HTML을 생성하고 다른 사람이 다시 이스케이프하기를 원하지 않는 경우 하나를 반환하려고합니다.
— SLaks

1
좋아, 나는 그것이 조금 더 가까워 진다고 생각하지만 (똑똑한 엉덩이로 건너 갈 위험이 있음) 다른 사람이 다시 탈출하기를 원하는지 어떻게 결정합니까? 이스케이프 된 HTML을 엉망으로 만들 수있는 능력을주는 것이 일반적으로 좋은 습관입니까? 나는 이런 구조를 본 적이 없다. "줄과 같지만 손대지 말아주세요. 손대지 못하게하는 것이 아니라, 손대지 말아야합니다." 그게 뭐야?
— devuxer

1
포인트는 일반 캐릭터와 달리,이다 이 문자열이 이미 인코딩 된. 따라서 만질 필요가 없습니다.
— SLaks
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.