如何从从 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.cshtml
的RazorClassLib1
项目中的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 [<PROJECT>] package <PACKAGE_NAME>
)在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 页面?的主要内容,如果未能解决你的问题,请参考以下文章
将 Grapevine (5.0.0-rc.7) 导入 NuGetForUnity 中未显示的 Unity 项目/NuGet 包
如何在我的新CSPROJ类库中包含带有本机dll的NuGet包?