C# 在MVC6中从外部程序集渲染视图

C# 在MVC6中从外部程序集渲染视图,c#,asp.net-core-mvc,C#,Asp.net Core Mvc,我能够从MVC6中的外部程序集加载控制器,这取决于它如何查找控制器。但我无法呈现也在该程序集中的视图,因为它说找不到该视图。包含视图和控制器的程序集的外观如下所示: 导入到其中的项目会找到控制器find,并很好地执行其中的代码,但找不到视图,显示此错误 如果查看错误,您将看到它试图在与应用程序路径相关的视图目录下查找视图。但是,您可以在Mvc/viewspath下查看实时视图 您可以尝试覆盖此选项。我不确定什么是最简单和正确的方法,但我想到的第一个想法是,您可以提供一个将/Mvc视为根文件夹的

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

导入到其中的项目会找到控制器find,并很好地执行其中的代码,但找不到视图,显示此错误

如果查看错误,您将看到它试图在与应用程序路径相关的
视图
目录下查找视图。但是,您可以在
Mvc/views
path下查看实时视图


您可以尝试覆盖此选项。我不确定什么是最简单和正确的方法,但我想到的第一个想法是,您可以提供一个将
/Mvc
视为根文件夹的文件提供程序。关于如何配置此项。

如果查看错误,您将看到它尝试在与应用程序路径相关的
视图
目录下查找视图。但是,您可以在
Mvc/views
path下查看实时视图


您可以尝试覆盖此选项。我不确定什么是最简单和正确的方法,但我想到的第一个想法是,您可以提供一个将
/Mvc
视为根文件夹的文件提供程序。关于如何配置这一点。

我最终以一种我相信是令人难以置信的黑客方式解决了这个问题

由于视图位于每个项目的
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);
    });

它不是完美的,但很管用。

我最终以一种我相信是难以置信的黑客方式解决了这个问题

由于视图位于每个项目的
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
。我在这里提供了有关如何使用这些的更多信息:

要从单独的程序集加载视图,您需要
EmbeddedFileProvider
CompositeFileProvider
。我在这里提供了有关如何使用这些的更多信息:

当您点击控制器操作(该操作应返回视图)时,您会遇到什么样的错误?我已用返回的错误更新了我的问题可能与您点击控制器操作(该操作应返回视图)时遇到的错误重复?我已更新了我的问题返回错误的问题可能重复