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.