在 MVC6 中从外部程序集呈现视图

Rendering Views from external assemblies in MVC6

由于 MVC6 查找控制器的方式,我能够从外部程序集加载控制器。但是我无法呈现也在该程序集中的视图,因为它说找不到。包含视图和控制器的程序集如下所示:

导入的项目找到controller find,执行里面的代码没问题,但是找不到view,显示这个错误

如果您查看错误,您会发现它试图在 Views 目录下查找与应用程序路径相关的视图。但是,您的视图位于 Mvc/Views 路径下。

您可以尝试覆盖它。我不确定执行此操作的最简单和正确的方法是什么,但我想到的第一个想法是您可以提供一个 FileProvider here on RazorViewEngineOptions which sees /Mvc as the root folder. Here is an example 来说明如何配置它。

我最终解决了这个问题,我认为这是一种令人难以置信的 hacky 方式。

由于视图在每个项目中,在 src 文件夹内,我将 src\Branch.Web 中 Mvc 应用程序的 RazorViewEngine 根更改为 src。所以每个视图都必须以项目名称为前缀,例如Branch.Game.Halo4。要启用此功能,我只需在 Startup.cs

中的 ConfigureServices 中执行此代码
    services.AddMvc().ConfigureRazorViewEngine(options =>
    {
        var oldRoot = ApplicationEnviroment.ApplicationBasePath;
        var trimmedRoot = oldRoot.Remove(oldRoot.LastIndexOf('\'));

        options.FileProvider = new PhysicalFileProvider(trimmedRoot);
    });

它并不完美,但它确实有效。

要从单独的程序集中加载视图,您需要 EmbeddedFileProviderCompositeFileProvider。我在此处提供了有关如何使用它们的更多信息: