【问题标题】:How do I output raw html when using RazorEngine (NOT from MVC)使用 RazorEngine 时如何输出原始 html(不是来自 MVC)
【发布时间】:2012-03-28 12:07:06
【问题描述】:

我正在尝试生成带有 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 编码的,但我需要对其进行解码。我怎样才能做到这一点?

【问题讨论】:

标签: c# razor html-encode


【解决方案1】:

RazorEngine 与 MVC 的 Razor 视图引擎一样,会自动对写入模板的值进行编码。为了解决这个问题,我们引入了一个名为IEncodedString 的接口,默认实现为HtmlEncodedStringRawString

要使用后者,只需调用TemplateBase 的内置Raw 方法:

@Raw(Model.EmailContent)

【讨论】:

  • @Matthew 抱歉恢复,但即使编译,它在 VS HTML 编辑器中看起来并不漂亮,它不再识别模型或原始。有什么解决方法吗?
  • @Jeff 我认为正确的方法是让 RazorEngine 公开一个具有静态方法 .Raw 的静态类 Html.cs,以便它处理对 Html.Raw 的标准调用,可以使用在 VS Razor 编辑器中获得正确的语法高亮显示。
  • @Manfred @Raw() 在 RazorEngine(不是 ASP.NET MVC 的 Razor ;) 中运行良好)
  • 也希望看到这个问题得到解决。这会导致整个项目无法在启用 MvcBuildViews 的情况下构建...
  • “HtmlEncodedString”不起作用!而是使用:RawString。看一个有效的例子! public RazorEngine.Text.IEncodedString GetMarcaFinalDocumento() { return new RazorEngine.Text.RawString("
    你好!
    ");}
【解决方案2】:

仅供参考,我有一个包含 @Html.Raw(...) 语法的分支:

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

【讨论】:

  • @Html.Raw() 不需要预先配置。很好的解决方案。
  • 我也是。我能够在 Razor 代码中生成 HTML 标记和值并将其传递给 View with ViewData 并使用 @Html.Ras(ViewData["NextEvent"] 显示
【解决方案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);
}

【讨论】:

    【解决方案4】:

    我发现所有这些都对我有用。

    @{var myHtmlString = new HtmlString(res);}
    @myHtmlString
    
    
      @MvcHtmlString.Create(res)
    
      @Html.Raw(res)
    

    【讨论】:

    • 您正在使用剃须刀引擎不提供的 MVC 库,因此这不是问题的答案。
    【解决方案5】:

    我使用的是 RazorEngine 3.8.2,@Raw(Model.Content) 对我来说工作得很好。

    【讨论】:

      【解决方案6】:

      为 RazorEngine 构建一个包装器,添加对 @Html.Raw()@Html.Partial() 的支持

      https://github.com/b9chris/RazorEngineComplete

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-15
        • 2016-06-30
        • 2021-03-31
        • 1970-01-01
        • 1970-01-01
        • 2020-06-08
        相关资源
        最近更新 更多