Razor보기에서 인코딩되지 않은 문자열 내보내기


81

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

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

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

답변:



17

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

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

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

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

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

2
실제로 new HtmlString()MVC 3에서도 사용할 수 있습니다. 그 유형은 .NET 4이기 때문에
marcind

과연! 그러나 모든 것을 하나의 표현으로 입력 할 때 나는 MVC를 하나 더 좋아합니다. 예 : @ MvcHtmlString.Create (myString). 개인적인 취향!
aolde 2010-07-29

6

new HtmlString이 확실히 답입니다.

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

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

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

또는

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

1
HTML을 출력하는 방법으로 @ = myString을 추가 할 수 있습니까? WebForms에 대한 플래시백이 너무 많을 수 있습니다.
aolde

2
우리는 주요 사용자 사례를 다루지 않는 구문 구조를 추가하지 않기를 원합니다. 대부분의 경우 도우미 메서드를 사용하여 문자열을 작성하고 IHtmlString이 완벽하게 작동합니다. 도우미없이 리터럴 문자열을 출력해야하는 이상한 경우의 경우 @Literal (foo) 또는 이와 유사한 메서드를 제공 할 수 있습니다.
Andrew Stanton-Nurse

0

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

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

@(new HtmlString(View.Foo))

// became
@RawView.Foo

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

@RawView["Foo"]

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

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


0

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.