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 "quotes"</div>