使用EmbeddedFileProvider搜索视图的优先级

时间:2017-04-09 07:42:35

标签: c# asp.net-core asp.net-core-mvc

我已将此代码拉入我引用的程序集中作为资源嵌入的视图:

services.Configure<RazorViewEngineOptions>(options =>
    {
        options.FileProviders.Add(new EmbeddedFileProvider(typeof(SomeTypeInMyAssembly).GetTypeInfo().Assembly));
    });

它成功地在嵌入位置(Views\Shared\Components\ViewComponentName\Default.cshtml)中查找视图。我需要它在查看任何程序集之前首先搜索当前项目中的文件,这样我就可以在程序集中创建默认值,并允许&#34;覆盖&#34;在主项目中(相同的路径)。任何人都有任何想法如何做到这一点?我仍然试图通过消息来源来解决这个问题。

不,ViewLocationExpander不是答案。我需要使用完全相同的路径和文件名,谢谢。

1 个答案:

答案 0 :(得分:0)

原来有两种选择:

  1. 添加 options.FileProviders.Add(HostingEnvironment.ContentRootFileProvider); 就在EmbeddedFileProvider之前。 (HostingEnvironment只是被采取了 来自Startup()构造函数并存储在Startup类的本地。磁盘上的物理文件(也可能位于缓存中)将在汇编版本之前找到。
  2. EmbeddedFileProvider换成您自己的类型(实施IFileProvider)并传入IHostingEnvironmentGetFileInfo()方法是 在尝试查找文件时调用。该 IHostingEnvironment实例用于检测物理 来自根内容路径的文件,如果存在本地文件,则返回NotFoundFileInfo

    public virtual IFileInfo GetFileInfo(string subpath)
    {
        if (_HostingEnvironment != null)
        {
            var filepath = Path.Combine(_HostingEnvironment.ContentRootPath, subpath.TrimStart('/'));
            if (File.Exists(filepath))
                return new NotFoundFileInfo(filepath);
        }
        return _EmbeddedFileProvider.GetFileInfo(subpath)
    }
    

    并将其添加到Startup.ConfigureServices()

    services.Configure<RazorViewEngineOptions>(options =>
    {
        options.FileProviders.Add(new MyEmbeddedFileProvider(typeof(SomeTypeInTheTargetAssembly).GetTypeInfo().Assembly, HostingEnvironment));
        });
     }