【问题标题】:RazorEngine.Text.RawString not working on regular MVC partial viewRazorEngine.Text.RawString 不适用于常规 MVC 局部视图
【发布时间】:2019-02-25 06:19:19
【问题描述】:

我使用RazorEngine.ParseRazorEngine 电子邮件重复使用相同的部分,但是当我在常规视图中使用相同的部分时new RazorEngine.Text.RawString 不起作用并且不会忽略HTML。我不能使用Html.Raw,因为RazorEngine 无法读取它。我该如何解决这个问题?

<p>
    @(new RazorEngine.Text.RawString(Model.Body))
</p>

在常规的 asp.net mvc razor 视图中显示底部标记。

<p>
   Welcome!&lt;br/&gt;&lt;br/&gt;Body
</p>

【问题讨论】:

  • 不确定您的问题。根据 RawString 的代码,这正是您的剃刀视图中应该显示的内容。原始字符串。该类有一个名为 ToEncodedString 的方法,根据其文档“应该”返回编码字符串,但它只返回构造函数中传递的相同值。该方法是在 ToString() 方法中调用的方法。 github.com/Antaris/RazorEngine/blob/master/src/source/…
  • 它在常规的 asp.net mvc 视图/部分中不起作用。它将
    显示为文本,而不是 HTML。就像我可以将此标记重用于常规视图,仅用于此电子邮件引擎使用的视图。它在网络浏览器中按字面意思显示

    。我更新了文字。
  • 通过查看RawString的实现,这正是它所做的,也许这应该是一个问题发布在RazorEngine的Github问题中?
  • 我做了并且一直在等待回复。

标签: asp.net-mvc razor razorengine razor-2


【解决方案1】:

您可以在创建RazorEngineService 的实例时指定ITemplateServiceConfiguration,如项目的git repository 中所示。

存储库中的代码:

/// <summary>
/// A simple helper demonstrating the @Html.Raw
/// </summary>
public class MyHtmlHelper
{
    /// <summary>
    /// A simple helper demonstrating the @Html.Raw
    /// </summary>
    public IEncodedString Raw(string rawString)
    {
        return new RawString(rawString);
    }
}

/// <summary>
/// A simple helper demonstrating the @Html.Raw
/// </summary>
public abstract class MyClassImplementingTemplateBase<T> : TemplateBase<T>
{
    /// <summary>
    /// A simple helper demonstrating the @Html.Raw
    /// </summary>
    public MyClassImplementingTemplateBase()
    {
        Html = new MyHtmlHelper();
    }

    /// <summary>
    /// A simple helper demonstrating the @Html.Raw
    /// </summary>
    public MyHtmlHelper Html { get; set; }
}

用法:

class Program
{
    static void Main(string[] args)
    {

        var config = new TemplateServiceConfiguration();
        config.BaseTemplateType = typeof(MyClassImplementingTemplateBase<>);
        using (var service = RazorEngineService.Create(config))
        {
            string template = "<p>@Html.Raw(Model.Body)</p>";
            var result = service.RunCompile(template, "templateKey", null, new { Body = "Welcome!<br /><br /><Label>Hello</label>" });
            Console.WriteLine(result);
        }
        Console.ReadLine();
    }
}

您唯一需要记住的是在创建RazorEngineService 的实例时提供ITemplateServiceConfiguration 对象。

PS: @(new RazorEngine.Text.RawString(Model.Body)) 在部分视图中不起作用,因为它包裹在 @() 周围,并且指令中的任何字符串在写入输出流之前都会被编码。

【讨论】:

  • 如果它不起作用,你有更好的包装括号选择吗?
  • @MikeFlynn 不是。
  • 真的吗?有没有更好的办法?
  • @MikeFlynn 我不知道。好吧,问题是您希望您的代码与两个不同的系统一起工作。一个解决方案与另一个解决方案不兼容,因此您必须克服一些限制,对吧?
  • 是的,我已经在两个不同的区域复制了内容,我简直不敢相信没有比您提供的模板更好的方法
猜你喜欢
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2017-10-02
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多