如何从从 NuGet 包获得的 RCL 导入 Razor 页面?

Posted

技术标签:

【中文标题】如何从从 NuGet 包获得的 RCL 导入 Razor 页面?【英文标题】:How do you import a Razor page from a RCL you got from a NuGet package? 【发布时间】:2022-01-15 05:50:24 【问题描述】:

RCL 代表 Razor 类库。

我使用共享文件 _Layout.cshtml 制作了自己的原型 RCL,我想将它包含在我的项目中。我已经从 NuGet 安装了 RCL,希望它能自动工作,但显然不能。

我删除了我的 _Layout.cshtml,希望它会从我制作的 RCL 中获取,但显然这不会像那样工作。我收到以下错误:

An unhandled exception occurred while processing the request.
InvalidOperationException: The layout view '_Layout' could not be located. The following locations were searched:
/Pages/_Layout.cshtml
/Pages/Shared/_Layout.cshtml
/Views/Shared/_Layout.cshtml

Microsoft.AspNetCore.Mvc.Razor.RazorView.GetLayoutPage(ViewContext context, string executingFilePath, string layoutPath)
如何将此 RCL 正确导入到我的新 Web 应用程序中?

更新

我将@using libnamehere 添加到我的_ViewImports.cshtml 文件中并注释掉_ViewStart.cshtml 中唯一的代码行,但现在我收到以下错误:

InvalidOperationException: RenderBody has not been called for the page at '/Pages/Shared/_Layout.cshtml'. To ignore call IgnoreBody().

Microsoft.AspNetCore.Mvc.Razor.RazorPage.EnsureRenderedBodyOrSections()

【问题讨论】:

【参考方案1】:

InvalidOperationException:尚未为页面调用 RenderBody 在“/Pages/Shared/_Layout.cshtml”。忽略调用 IgnoreBody()。

Microsoft.AspNetCore.Mvc.Razor.RazorPage.EnsureRenderedBodyOrSections()

默认情况下,每个布局都必须调用RenderBody。请务必在您的_Layout.cshtml 中添加@RenderBody()

参考:

Layout in ASP.NET Core

整个工作步骤:

1.从 Visual Studio 中选择新建一个新项目

2.选择Razor 类库 > 点击下一步

3.为库命名(例如,RazorClassLib1),> 点击创建。为避免文件名与生成的视图库冲突,请确保库名不以 .Views 结尾。

4.选择S支持页面和视图 >选择创建

5.在RazorClassLib1项目中添加/Pages/Shared中的_BaseTemplateLayout.cshtml

<body>
    <div class="body">
        <h1>Layout</h1>
        @RenderBody()
    </div>
</body>

6.在名为_ViewStart.cshtmlRazorClassLib1 项目中的Pages 文件夹中添加一个新的Razor View Start 文件。默认模板应包含以下代码:

@
    Layout = "_BaseTemplateLayout";

项目结构:

7.在RazorClassLib1项目中运行打包命令:

dotnet 包

得到结果:

8.创建一个名为TestProject1的Mvc/Razor pages项目。

9.我们需要进入目标项目(TestProject1) .csproj 文件。在这里,我们指出了本地 NuGet 包和 NuGet 流的路径。它应该是这样的:

<PropertyGroup>
   <TargetFramework>net5.0</TargetFramework>
    <RestoreSources>$(RestoreSources);absolute-path-to-my-solution/bin/Debug;https://api.nuget.org/v3/index.json</RestoreSources>
</PropertyGroup>

您需要将上面的absolute-path-to-my-solution/bin/Debug 替换为您的包所在位置的绝对路径。当您运行 pack 命令时,您可以使用位置(步骤 7)获得成功的结果。

10.使用命令(dotnet add [&lt;PROJECT&gt;] package &lt;PACKAGE_NAME&gt;)在TestProject1项目中安装nuget包:

dotnet add TestProject1 package RazorClassLib1

11.确保在 Startup.cs 中添加剃刀页面支持:

services.AddRazorPages();

12.在TestProject1项目中更改你的_ViewStart.cshtml:

@
    Layout = "_BaseTemplateLayout";

【讨论】:

我在 RCL 中的 _Layout.cshtml 包含 RenderBody()... 其实这个错误表示没有RenderBody(),请在/Pages/Shared/_Layout.cshtml中查看,并为您的项目结构解释更多。 新项目中没有_Layout.cshtml,只有RCL中。另外,我对新项目中的更改在技术上不正确,抱歉,让我解决这个问题。 只是为了确认。您的 RCL 包含 _Layout.cshtml,并且您希望将此布局应用到另一个 asp.net 核心项目。并且您的 asp.net 核心项目没有 _Layout.cshtml 并删除 _ViewStart.cshtml 中的 `Layout = "_Layout";`。因此,您只需在视图/页面中应用布局(如 Index.cshtml)。你想按照我说的去做吗? 嗨@Munchkin,请查看我的详细更新答案。

以上是关于如何从从 NuGet 包获得的 RCL 导入 Razor 页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 pyspark 中的本地 jar 导入包?

为啥包在 NuGet 上不可用?

将 Grapevine (5.0.0-rc.7) 导入 NuGetForUnity 中未显示的 Unity 项目/NuGet 包

如何在我的新CSPROJ类库中包含带有本机dll的NuGet包?

Javascript:从从 XML 文件导入数据切换到从 JS 对象数组导入数据

从 CI 到生产 Nuget 源的 Nuget 包版本控制和推广