在 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);
});
它并不完美,但它确实有效。
要从单独的程序集中加载视图,您需要 EmbeddedFileProvider
和 CompositeFileProvider
。我在此处提供了有关如何使用它们的更多信息:
由于 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);
});
它并不完美,但它确实有效。
要从单独的程序集中加载视图,您需要 EmbeddedFileProvider
和 CompositeFileProvider
。我在此处提供了有关如何使用它们的更多信息: