我有一个带有Emails项目的应用程序,该项目公开了一个类,可以使用IRazorViewEngine编译电子邮件模板并发送它。

但是,它在几个不同的项目中使用,默认情况下,RazorViewEngine似乎只在相关Web项目的Views文件夹中查找。这意味着我必须在项目之间重复相同的视图。

我已经研究过扩展RazorViewEngine来修改其查找视图的位置,但是每个示例都会更改其查找项目中的哪个文件夹,而不是哪个项目,并且通过快速查看RazorViewEngine源,它明确希望在应用程序本地路径(即以“〜”或“ /”开头),阻碍了我幼稚的尝试使用绝对路径或以“ ../”开头的路径。

有没有一种方法可以确保RazorViewEngine(或子类)检查特定的(非动态)项目,而不是Web项目调用它?

该应用程序使用的是.Net Core 1.1,RazorEngine似乎不支持

最佳答案

我在控制器中将Views作为文件读取,并将使用该字符串进行razor编译。

控制器:

     _emailBuilder = new RazorHtmlBuilder();
     var tempatePath =
     HttpContext.Current.Server.MapPath("~/Views/Mail/HelloFriend.cshtml");
     string template = File.ReadAllText(tempatePath);
     var body = _emailBuilder.BuildEmail("someUniqueId", template , new Friend() {Name: "John"});


使用razor engine在上下文(不同项目)之外的Razor Email Builder

    using System;
    using RazorEngine;
    using RazorEngine.Templating;
    namespace Project.ServiceLayer.Helpers.EmailBuilder
    {
        public class RazorHtmlBuilder
        {
            public string BuildEmail<T>(string templateName, string template, T model)
            {
                try
                {
                    return Engine.Razor.RunCompile(template, templateName, typeof (T), model);
                }
                catch (Exception ex)
                {
                    //log error
                }
            }
    }

关于c# - 更改RazorViewEngine以在特定项目(.Net Core)中查找 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44263642/

10-11 22:39
查看更多