RazorEngine을 사용할 때 원시 HTML을 출력하는 방법 (MVC가 아님)


105

HTML 콘텐츠로 이메일을 생성하려고합니다. 이 내용은 이미 위생 처리를 거쳤으므로 그 점에 대해서는 걱정하지 않습니다.

Razor.Parse(template, model);

다음 Razor 템플릿에서 :

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    <body>
        @(new System.Web.HtmlString(Model.EmailContent))
    </body>
</html>

출력되는 이메일은 HTMl로 인코딩되었지만 디코딩이 필요합니다. 어떻게 할 수 있습니까?


나는 이것에 대답했지만 여기에 대답했기 때문에 중복 대답으로 삭제되었습니다 : stackoverflow.com/questions/23603593/ ... ...이 대답은 MVC와 RazorEngine 모두에서 작동합니다.
Brian Rice

답변:


181

MVC의 Razor View Engine과 같은 RazorEngine은 템플릿에 기록 된 값을 자동으로 인코딩합니다. 이 문제를 해결하기 위해 IEncodedString기본 구현이 HtmlEncodedString및 인 인터페이스를 도입했습니다 RawString.

후자를 사용하려면 다음의 내장 Raw메소드를 호출하기 만하면됩니다 TemplateBase.

@Raw(Model.EmailContent)

4
@Matthew 되살려 서 미안하지만 이것이 컴파일 되더라도 VS HTML 편집기에서는보기가 좋지 않으며 더 이상 Model 또는 Raw를 인식하지 못합니다. 해결 방법이 있습니까?
Jeff

5
@Jeff 올바른 접근 방식은 RazorEngine이 정적 메서드 .Raw가있는 정적 클래스 Html.cs를 노출하여 VS Razor에서 올바른 구문 강조 표시를 얻는 데 사용할 수있는 Html.Raw에 대한 표준 호출을 처리하는 것이라고 생각합니다. 편집자.
Tod Thomson

8
@Manfred @Raw ()는 RazorEngine에서 잘 작동합니다 (ASP.NET MVC의 Razor가 아님;))
Jeff

이것도 해결되는 것을보고 싶습니다. 이로 인해 전체 프로젝트가 MvcBuildViews가 활성화 된 상태에서 빌드되지 않습니다 ...
guidupuy

2
"HtmlEncodedString"이 작동하지 않습니다! 대신 사용 : RawString. 작동하는 예를 참조하십시오! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento () {return new RazorEngine.Text.RawString ( "<div> 안녕하세요! </ div>");}
Charles

15

참고로 여기에 @ Html.Raw (...) 구문이 포함 된 포크가 있습니다.

https://github.com/Antaris/RazorEngine/pull/105


3
@ Html.Raw ()는 사전 구성이 필요하지 않습니다. 좋은 솔루션입니다.
MartinJH

나도. Razor 코드에서 HTML 태그와 값을 생성하고 ViewData를 사용하여 View에 전달하고 @ Html.Ras (ViewData [ "NextEvent"]를 사용하여 표시 할 수있었습니다.
JustJohn

3

템플릿에 대한 사용자 지정 기본 클래스가있는 경우 Write일반 MVC 템플릿과 유사하게 동작하도록 메서드를 코딩 할 수 있습니다 . 출력 값이IHtmlString 경우 인코딩해서는 안됩니다.

TemplateBase수업 에서 사용중인 코드는 다음과 같습니다 .

// Writes the results of expressions like: "@foo.Bar"
public virtual void Write(object value)
{
    if (value is IHtmlString)
        WriteLiteral(value);
    else
        WriteLiteral(AntiXssEncoder.HtmlEncode(value.ToString(), false));
}

// Writes literals like markup: "<p>Foo</p>"
public virtual void WriteLiteral(object value)
{
    Buffer.Append(value);
}

3

RazorEngine 3.8.2를 사용하고 @Raw(Model.Content)있으며 완벽하게 잘 작동합니다.



-1

이 모든 것이 저와 함께 작동한다는 것을 알았습니다.

@{var myHtmlString = new HtmlString(res);}
@myHtmlString


  @MvcHtmlString.Create(res)

  @Html.Raw(res)

4
면도기 엔진에서 사용할 수없는 MVC 라이브러리를 사용하고 있으므로 질문에 대한 답이 아닙니다.
oligofren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.