如何使用 RazorEngine 将 System.Text.RegularExpressions 添加到模板?

How do I add System.Text.RegularExpressions to a template using RazorEngine?

我正在使用 RazorEngine 呈现 HTML 电子邮件并希望包含辅助函数。其中之一使用正则表达式:

// template.cshtml
@using System.Text.RegularExpressions

@functions {
  public string FixImageUrlParam(string url, int width, int height)
  {
    Regex widthParam = new Regex("w=[0-9]*");
    Regex heightParam = new Regex("h=[0-9]*");

    url = widthParam.Replace(url, $"w={width}");
    url = heightParam.Replace(url, $"h={height}");

    return url;
  }
}

这是我的 config/rendering 逻辑。

// renderer.cs
public static string RenderTemplate(string template, string dataModel)
{
    TemplateServiceConfiguration config = new TemplateServiceConfiguration();
    config.Namespaces.Add("System.Text.RegularExpressions");
    Engine.Razor = RazorEngineService.Create(config); ;


    Engine.Razor.AddTemplate("template", File.ReadAllText("template.cshtml"));
    Engine.Razor.Compile("template", null);
    return = Engine.Razor.Run("template", null, JsonConvert.DeserializeObject<ExpandoObject>(File.ReadAllText("data.json")));
}

问题是我的辅助函数在 RazorEngine 尝试渲染时导致错误。我已将错误隔离到使用 Regex 命名空间的行。

Errors while compiling a Template.
Please try the following to solve the situation:  
  * If the problem is about missing references either try to load the missing references manually (in the compiling appdomain!) or
    Specify your references manually by providing your own IReferenceResolver implementation.
    Currently all references have to be available as files!
  * If you get 'class' does not contain a definition for 'member': 
        try another modelType (for example 'null' or 'typeof(DynamicObject)' to make the model dynamic).
        NOTE: You CANNOT use typeof(dynamic)!
    Or try to use static instead of anonymous/dynamic types.
More details about the error:
 - error: (862, 35) Unexpected character '$'
\t - error: (863, 36) Unexpected character '$'
Temporary files of the compilation can be found in (please delete the folder): C:\Users\anstackh\AppData\Local\Temp\RazorEngine_3gknk4fd.poe

您是否尝试过删除字符串插值?很可能,这就是错误所在。

尝试将第一个片段更改为:

// template.cshtml
@using System.Text.RegularExpressions

@functions {
  public string FixImageUrlParam(string url, int width, int height)
  {
    Regex widthParam = new Regex("w=[0-9]*");
    Regex heightParam = new Regex("h=[0-9]*");

    url = widthParam.Replace(url, "w=" + width.ToString());
    url = heightParam.Replace(url, "h=" + height.ToString());

    return url;
  }
}