[asp.net] Razor보기에서 인코딩되지 않은 문자열 내보내기

ScottGu가 자신의 블로그 게시물에서 “기본적으로 @ 블록을 사용하여 내보내는 콘텐츠는 XSS 공격 시나리오로부터 더 잘 보호하기 위해 자동으로 HTML 인코딩됩니다” 라고 말합니다 . 내 질문은 : HTML로 인코딩되지 않은 문자열을 어떻게 출력 할 수 있습니까?

단순성을 위해 pls는 다음과 같은 간단한 경우를 고수합니다.

@{
 var html = "<a href='#'>Click me</a>"
 // I want to emit the previous string as pure HTML code...
}



답변

이것이 제가 가장 좋아하는 접근 방식입니다.

@Html.Raw("<p>my paragraph text</p>")

출처는 Phil Haack의 Razor 구문 참조입니다. http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx


답변

HTML로 인코딩되지 않는 MvcHtmlString의 새 인스턴스를 만들 수 있습니다.

@{
  var html = MvcHtmlString.Create("<a href='#'>Click me</a>")
}

Razor의 미래에 더 쉬운 방법이 있기를 바랍니다.

MVC를 사용하지 않는 경우 다음을 시도 할 수 있습니다.

@{
  var html = new HtmlString("<a href='#'>Click me</a>")
}


답변

new HtmlString이 확실히 답입니다.

우리는 다른 면도기 구문 변경 사항을 조사했지만 궁극적으로 새로운 HtmlString보다 더 짧은 것은 없었습니다.

그러나 우리는 그것을 도우미로 포장 할 수 있습니다. 혹시…

@Html.Literal("<p>something</p>")

또는

@"<p>something</p>".AsHtml()


답변

프로젝트를 새로운 Razor 뷰 엔진으로 전환 할 때도이 문제가 발생했습니다. C #에서 JSON 데이터를 생성하고 페이지로드시 출력하기를 원했기 때문에 제가 취한 접근 방식은 약간 달랐습니다.

결국 내가 한 일은 cshtml 파일 내에서 View와 유사한 RawView를 구현하는 것이 었습니다. 기본적으로 원시 문자열을 얻으려면

@(new HtmlString(View.Foo))

// became
@RawView.Foo

이를 위해서는 프로젝트 레이아웃을 약간 변경해야하므로 여기에 블로그 게시물을 작성했습니다 . 즉, MVC의 DynamicViewDataDictionary와 RawView를 포함하는 새로운 WebViewPage의 중복 구현이 필요했습니다. 또한 RawView에서 인덱스 연산자를 구현하여

@RawView["Foo"]

누군가가 키 목록을 사용하여 데이터를 반복해야하는 경우

anurse의 의견을 읽으면 RawView 대신 Literal로 이름을 지정했다면 더 좋았을 것입니다.


답변

Mono에서 ASP.NET MVC와 Razor를 사용하고 있습니다.

어떤 이유로 System.Web.Mvc의 System.Web.WebPages에서 HtmlHelper를 가져올 수 없습니다.

하지만 모델의 속성을 RazorEngine.Text.RawString. 이제 예상대로 출력됩니다.

@{
    var txt = new RawString("some text with \"quotes\"");
    var txt2 = "some text with \"quotes\"";
}
<div>Here is unencoded text: @txt</div>
<div>Here is encoded text: @txt2</div>

산출:

<div>Here is unencoded text: some text with "quotes"</div>
<div>Here is encoded text: some text with &quot;quotes&quot;</div>


답변