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

时间:2018-07-27 19:00:55

标签: c# regex razor namespaces 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;
  }
}

这是我的配置/渲染逻辑。

// 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

1 个答案:

答案 0 :(得分:3)

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

尝试将第一个代码段更改为此:

// 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;
  }
}