我的大部分观点都是有规律的<action>.cshtml
正常情况下的文件/Views/<Controller>
文件夹层次结构。它们在 git 中进行源代码控制,并以通常的“删除和替换”方式部署。
不过,我还使用 Razor 渲染模板来创建 HTML 电子邮件,并且电子邮件 .cshtml 模板特定于每个客户端。因此我希望能够加载并渲染它们outside应用程序根文件夹,因此特定于客户端的自定义设置在部署过程中不会丢失。
我已经成功创建并注册了一个实现IViewLocationExpander
界面,这适用于应用程序根目录内的文件夹:
public class EmailViewLocationExpander : IViewLocationExpander
{
protected readonly String _TemplateFolder;
public EmailViewLocationExpander( String TemplateFolder )
{
_TemplateFolder = TemplateFolder.Trim('/');
}
public void PopulateValues( ViewLocationExpanderContext context )
{
}
public IEnumerable<string> ExpandViewLocations( ViewLocationExpanderContext context, IEnumerable<string> viewLocations )
{
var result = new List<String>( viewLocations );
result.Add( $"/{ _TemplateFolder }/Email/{{0}}.cshtml" );
result.Add( $"/{ _TemplateFolder }/Shared/{{0}}.cshtml" );
return result;
}
}
它似乎不适用于除应用程序根相对路径之外的路径,因此例如/../Templates
似乎不起作用。
我目前也依赖于定制_ViewStart.cshtml
我的电子邮件模板,并阅读Mvc源代码 https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc.Razor.Host/ViewHierarchyUtility.cs让我认为我唯一的选择是实施自定义IFileProvider
引用当前应用程序根目录之外的物理文件系统 - 这是正确的吗?如果是的话,任何人都可以帮我举个例子吗?
这对我来说似乎是正确的。这ViewLocationExpander
处理相对于 wwwroot 文件夹的路径,因此对于指定该文件夹之外的文件的路径没有用处。
这是一篇关于实现的非常好的文章IFileProvider
。这些文章演示了创建和IFileProvider
用于访问存储在数据库中的视图,但从文件系统中读取它们将更加容易。所以这是一个很好的概述,说明了需要考虑的事项。https://www.mikesdotnetting.com/article/301/loading-asp-net-core-mvc-views-from-a-database-or-other-location https://www.mikesdotnetting.com/article/301/loading-asp-net-core-mvc-views-from-a-database-or-other-location
我注意到的一件事是IFileProvider
作品非常酷。您将自定义实现注册为 RazorViewEngine 的一个选项,如下所示,当 ViewEngine 需要获取文件时,它会按顺序向每个 FileProvider 询问该文件,直到有人返回该文件。
public void ConfigureServices(IServiceCollection services)
{
string customLocation = @"c:\mylocation\"
// Add framework services.
services.AddMvc();
services.Configure<RazorViewEngineOptions>(opts =>
opts.FileProviders.Add(
new MyCustomFileProvider(customLocation)
)
);
}
所以最后,你基本上只是实现你的FileProvider
为某些特定的 url 端点提供文件。您可以从任何您喜欢的地方获取它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)