提问人:Tapani Talvitie 提问时间:11/11/2023 最后编辑:Tapani Talvitie 更新时间:11/13/2023 访问量:61
包含泛型页面的 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]
问:
我有一个 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 页面,请执行以下操作:
将 Sdk 从典型类库 Microsoft.NET.Sdk 更改为 Microsoft.NET.Sdk.Razor
添加框架引用 <FrameworkReference Include=“Microsoft.AspNetCore.App” />
将以下行添加到 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
路由:
成功生成类库后,可以通过将以下内容添加到 App1 的 Program.cs 来将类库路由包含到主应用:
builder.Services.AddRazorPages().AddRazorPagesOptions(options => {
options.Conventions.AddAreaPageRoute("TheLib", "/pages/Index", "customRouteForTheLibRazorPages");
});
和:
app.UseEndpoints(endpoints => {
endpoints.MapRazorPages();
});
现在 App1 似乎可以构建和运行,我也可以轻松地重用和维护 App2 和 App3 的 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
答: 暂无答案
评论