在 ASP.NET Core MVC 中,是否可以从项目文件夹外部添加 View 文件夹?

2024-03-19

我的大部分观点都是有规律的<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(使用前将#替换为@)

在 ASP.NET Core MVC 中,是否可以从项目文件夹外部添加 View 文件夹? 的相关文章

随机推荐