包含泛型页面的 ASP.NET Core 7.0 C# 可重用 MVC/Razor 类库:_ViewImports.cshtml 中的命名空间未在 Razor 页面中解析 [已关闭]

ASP.NET Core 7.0 C# reusable MVC/Razor Class Library containing generic pages: Namespace from _ViewImports.cshtml not resolving in razor pages [closed]

提问人:Tapani Talvitie 提问时间:11/11/2023 最后编辑:Tapani Talvitie 更新时间:11/13/2023 访问量:61

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

10天前关闭。

这篇文章在9天前被编辑并提交审核。

我有一个 ASP.NET 核心 WebApp 项目 App1。我想将一些通用功能移动到类库项目,包括 MVC/Razor 页面的控制器和视图。执行此操作的最佳做法是什么?我仍在为命名空间而苦苦挣扎。在TheLib中,我有_ViewImports.cshtml,其中包含行“@namespace TheLib.Pages”。当我单独构建 TheLib 时,我可以确认 _ViewImports.cshtml 没有被完全忽略,但由于某种原因,“@namespace TheLib.Pages”行是,剃刀页面不知道命名空间。因此,除非我将“@namespace TheLib.Pages”行添加到每个 cshtml 文件中,否则构建会失败。是否有解决方案可以使 _ViewImports.cshtml 命名空间在类库中以某种方式工作?

错误信息:

TheLib\Microsoft.NET.Sdk.Razor.SourceGenerators\Microsoft.NET.Sdk.Razor.SourceGenerators.RazorSourceGenerator\pages_LibTest_cshtml.g.cs(81,71):错误 CS0246:找不到类型或命名空间名称“LibTestModel”(是否缺少 using 指令或程序集引用?

LibTestModel(在 LibTest.cs.cshtml 中)具有namespace TheLib.Pages;

App1.csproj:

包括对 TheLib 类库的项目引用:

<Project Sdk="Microsoft.NET.Sdk.Web">
  <ItemGroup>
    <ProjectReference Include="..\TheLib\TheLib.csproj" />
  </ItemGroup>

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
</Project>

TheLib.csproj:

若要启用 MVC 和 Razor 页面,请执行以下操作:

  1. 将 Sdk 从典型类库 Microsoft.NET.Sdk 更改为 Microsoft.NET.Sdk.Razor

  2. 添加框架引用 <FrameworkReference Include=“Microsoft.AspNetCore.App” />

  3. 将以下行添加到 PropertyGroup:<AddRazorSupportForMvc>true</AddRazorSupportForMvc>


<Project Sdk="Microsoft.NET.Sdk.Razor">
  <ItemGroup>                                                                                                        
    <FrameworkReference Include="Microsoft.AspNetCore.App" /> 
  </ItemGroup>

  <PropertyGroup>
    <TargetFramework>net7.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <AddRazorSupportForMvc>true</AddRazorSupportForMvc>
  </PropertyGroup>
</Project>

上面非常简短和简单的 csproj 文件似乎是一个有效的文件。

包含类库的视图和控制器的 Pages 文件夹:

接下来,我将典型的 Pages 文件夹创建到 TheLib 项目的根目录,并从 App1 项目中移动到那里的一些 *.cshtml 和 *.cshtml.cs 文件。您可能希望先从单个页面开始进行概念验证。同时复制 _ViewImports.cshtml 等文件

  • 请记住检查文件的命名空间。例如,在本例中,将命名空间从 App1.Pages 更改为 TheLib.Pages

  • 还要注意路由:如果发生冲突,主应用程序路由将替代库路由(例如:如果两个 Pages 文件夹的根目录中都有 Index.cshtml,则将执行主应用程序 Index.cshtml,而不是类库 Index.cshtml)

现在,TheLib 应该通过在 TheLib 项目根文件夹中运行终端中的以下命令来很好地构建(除了:TheLib razor 页面中的命名空间不会像预期行为那样从 _ViewImports.cshtml 解析)。为了安全起见,请先干净地运行:

  • dotnet clean

  • dotnet build

路由:

成功生成类库后,可以通过将以下内容添加到 App1Program.cs 来将类库路由包含到主应用:

builder.Services.AddRazorPages().AddRazorPagesOptions(options => {
    options.Conventions.AddAreaPageRoute("TheLib", "/pages/Index", "customRouteForTheLibRazorPages");
});

和:

app.UseEndpoints(endpoints => {
    endpoints.MapRazorPages();
});

现在 App1 似乎可以构建和运行,我也可以轻松地重用和维护 App2App3 的 TheLib 中的泛型视图和控制器,并且都在同一个 VSCode 解决方案中,除了:TheLib 剃刀页面中的命名空间不会像预期行为那样从 _ViewImports.cshtml 解析。

我有以下设置:

  • Visual Studio 代码:1.83.1

  • 已安装的 .NET SDK:7.0.403.NET SDK.NET SDKs installed: 7.0.403

  • 已安装的 .NET 运行时:Microsoft.AspNetCore.App 7.0.13、Microsoft.NETCore.App 7.0.13 Microsoft.WindowsDesktop.App 7.0.13

  • Windows 11,版本:10.0.22621

C# 剃刀页 asp.net-core-7.0

评论

1赞 Guru Stron 11/11/2023
实际问题是什么?看来你已经完成了文档中写的。
0赞 Tapani Talvitie 11/11/2023
@GuruStron 这是正确的方法吗?我仍在为命名空间而苦苦挣扎。在TheLib中,我有_ViewImports.cshtml,其中包含行“@namespace TheLib.Pages”。当我单独构建 TheLib 时,我可以确认 _ViewImports.cshtml 没有被完全忽略,但由于某种原因,“@namespace TheLib.Pages”行是,剃刀页面不知道命名空间。因此,除非我将“@namespace TheLib.Pages”行添加到每个 cshtml 文件中,否则构建会失败。不知道为什么会这样。对不起,我的问题有点不完整,我现在就编辑
0赞 Guru Stron 11/11/2023
请提供一个最小的可重复示例
0赞 Tapani Talvitie 11/11/2023
按照我的描述创建项目应该重现我理解中的行为
0赞 Tapani Talvitie 11/11/2023
为了确认 TheLib 的 _ViewImports.cshtml 没有被完全忽略:我对它进行了更改,导致生成失败。例如:添加“@using TheLib.Pages”或“@implements dummyfoo”或“@using dummyfoo”会使生成失败,因此不会忽略该文件。但是其中的@namespace TheLib.Pages 没有任何影响,我可以把它拿出来,没有任何变化。只有将其添加到单个 cshtml 文件中才能解决生成问题。

答: 暂无答案