ASP.NET Core 6 MVC - 从不同的 class 库项目访问视图 (.cshtml) 页面

ASP.NET Core 6 MVC - access a view (.cshtml) page from a different class library project

我们有一个场景,我们必须将我们的几个视图页面从我们的 Web API 项目移到一个单独的 class 库。这个 class 库将被需要加载这些共享视图页面作为功能的一部分的不同 Web API 项目使用。我一直在寻找一天,但找不到方法。

从 Web API 项目中访问时,视图页面没有问题,但我们现在已将这些视图页面移动到我们现有的公共库(class 库)并将其添加为对 Web API 项目的引用。基本上当我们使用包含视图的公共 class 库构建应用程序时(我们将 属性 更改为 Content 因此它在构建时添加),它被构建并复制到 bin 中文件夹。因此,我们可以说视图文件应该可以访问,因为它就在项目程序集 bin 文件夹中。

现在发生的情况是,即使将 Web 应用程序构建器设置为指定 Content 目录指向此,它仍然无法看到 View 页面并且出现错误

The view was not found

代码:

var builder = WebApplication.CreateBuilder(new WebApplicationOptions { 
    Args = args,
    ContentRootPath = PlatformServices.Default.Application.ApplicationBasePath
});

让我感到困扰的是,当我们将视图页面放回 Web API 项目时,会生成相同的 /Views 文件夹。相同的结构和文件。只是放到别的项目里,现在就认不出来了。在 Web 上查看页面 API 有效,而将其放到另一个项目中则无效。

这是一个必需的结构,我们需要在不使用 RCL 的情况下实现它,但在被不同的 Web API 引用时仍然可以工作。这可能看起来很奇怪,但这是我们需要做的,如果可能的话,只需进行最小的更改。

非常感谢您的帮助!

经过几次尝试,我们能够通过将资源对象设置为 Embedded Resource 并在公共库中实现 ManifestEmbeddedFileProvider 来实现这一点,以便在发布时虚拟映射位置作为 NuGet。在这种情况下,假设我们在公共库中有一个名为 /StaticResources 的文件夹。在下面的示例代码中,Program 指的是您的程序集或应用程序中的任何 class 对象。

代码:

// Get embedded file assembly path to allow our static files to be read by the consuming apps
var manifestEmbeddedProvider = new ManifestEmbeddedFileProvider(
    typeof(Program).Assembly,
    "/StaticResources");

// Sets the `/StaticResources` folder to be servable like a wwwroot folder
app.UseStaticFiles(new StaticFileOptions {
    FileProvider = manifestEmbeddedProvider,
    RequestPath = "/Resources"
});

// Use it like this
<script src="/Resources/MyScrtipt.js"></script>

为了使 View() 正常工作,假设您的视图位于 /StaticResources 文件夹中。

var viewsFileProvider = new ManifestEmbeddedFileProvider(
    typeof(Program).Assembly,
    "/StaticResources");

app.UseStaticFiles(new StaticFileOptions {
    FileProvider = viewsFileProvider,
    RequestPath = "/Views/Shared"
});

希望这对遇到此问题的任何人有所帮助。感谢所有分享答案的人。