我最近尝试实现 Scott Sauber 解释的剃须刀电子邮件模板
教程在这里:https://scottsauber.com/2018/07/07/walkthrough-creating-an-html-email-template-with-razor-and-razor-class-libraries-and-rendering-it-from-a-net-standard-class-library/
问题是我必须克服一个错误(https://stackoverflow.com/a/56504181/249895),该错误需要组件所在的相关 netcodeapp2.2。
var viewPath = ‘~/bin/Debug/netcoreapp2.2/Views/MainView.cshtml’;
_viewEngine.GetView(executingFilePath: viewPath , viewPath: viewPath , isMainPage: true);
可以通过以下代码获取bin\Debug\netcoreapp2.2:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
public class RenderingService : IRenderingService
{
private readonly IHostingEnvironment _hostingEnvironment;
public RenderingService(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
public string RelativeAssemblyDirectory()
{
var contentRootPath = _hostingEnvironment.ContentRootPath;
string executingAssemblyDirectoryAbsolutePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string executingAssemblyDirectoryRelativePath = System.IO.Path.GetRelativePath(contentRootPath, executingAssemblyDirectoryAbsolutePath);
return executingAssemblyDirectoryRelativePath;
}
}
在我遇到有关模板文件的问题之前,一切都很好。问题是即使文件在~\bin\Debug\netcoreapp2.2 中,它也会在根文件夹中搜索模板,例如rootfolder\Views\Shared\_Layout.cshtml,而不是rootfolder\bin\Debug\netcoreapp2.2\Views\Shared\_Layout.cshtml。
这很可能是由于我将视图作为嵌入资源放在 CLASS LIBRARY 中而不是直接在 Web Api 解决方案中。
奇怪的是,如果你没有根文件夹中的文件,你仍然会得到CACHED 布局页面。
好消息是,当您发布解决方案时,它会将解决方案展平,因此 VIEWS 位于 ROOT 文件夹中。
[解决方案]
解决方案似乎在 Startup.cs 文件夹中。
从这里得到我的解决方案:Cannot find view located in referenced project
//https://stackoverflow.com/q/50934768/249895
services.Configure<Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions>(o => {
o.ViewLocationFormats.Add("/Views/{0}" + Microsoft.AspNetCore.Mvc.Razor.RazorViewEngine.ViewExtension);
o.FileProviders.Add(new Microsoft.Extensions.FileProviders.PhysicalFileProvider(AppContext.BaseDirectory));
});
在这之后,你可以这样写你的代码:
var contentRootPath = _hostingEnvironment.ContentRootPath;
string executingAssemblyDirectoryAbsolutePath = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
string executingAssemblyDirectoryRelativePath = System.IO.Path.GetRelativePath(contentRootPath, executingAssemblyDirectoryAbsolutePath);
string executingFilePath = $"{executingAssemblyDirectoryAbsolutePath.Replace('\\', '/')}/Views/Main.cshtml";
string viewPath = "~/Views/Main.cshtml";
string mainViewRelativePath = $"~/{executingAssemblyDirectoryRelativePath.Replace('\\','/')}/Views/Main.cshtml";
var getViewResult = _viewEngine.GetView(executingFilePath: executingFilePath, viewPath: viewPath, isMainPage: true);
<!-- OR -->
var getViewResult = _viewEngine.GetView(executingFilePath: viewPath, viewPath: viewPath, isMainPage: true);