Class 部分页面的库标签助手在 ASP.NET Core 3.1 Razor Pages 应用程序中不起作用

Class Library Tag Helper for Partial Pages not working in ASP.NET Core 3.1 Razor Pages application

作为 ASP.NET Core 3.1 Razor Pages Web 应用程序工作的一部分,我创建了几个自定义标记帮助程序。一旦我让所有这些都按照我想要和预期的方式工作(作为 ASP.NET Core 3.1 应用程序的一部分),我将 Tag Helpers 移动到 Razor Class 库(.NET Standard 2.1),所以我可以在其他应用程序中使用自定义标签助手。

这就是我 运行 使用 PartialTagHelper 呈现部分页面的标签助手问题 class:

TypeLoadException: Could not load type 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope' from assembly 'Microsoft.AspNetCore.Mvc.ViewFeatures, Version=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.

PartialTagHelper class 的构造函数需要此错误中指出的 IViewBufferScope 参数,并通过依赖注入传递到自定义标签助手代码中。

在 ASP.NET Core 3.1 Razor 页面中,自定义 Tag Helper 代码需要对 Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers 命名空间的 'using' 引用。

在 Razor 库中,自定义 Tag Helper 代码需要 'using' 对 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 命名空间的引用。

我还尝试使用 .NET Standard 2.0 和 2.1 以及 .NET Core 3.1 Class 库。在所有这些情况下,Class 库需要引用 Microsoft.AspNetCore.Mvc.ViewFeatures 2.2.0 版和 Microsoft.AspNetCore.Razor 2.2.0 版才能编译。

所以,错误听起来像 ASP.NET Core 3.1 Razor Page 正在注入 3.1.3 Microsoft.AspNetCore.Mvc.ViewFeatures 程序集,并且它不包含来自正确程序集的 IViewBufferScope 参数。

有办法解决吗?

谢谢

一个多星期前(2020 年 5 月 20 日),我发现了如何创建适用于 ASP.NET Core 3.1 Razor 页面的包,但有一个不同的包可以适用于较低版本级别(例如,.NET Framework 4.8 Razor Pages 应用程序)。让我先解释一下我最初是如何让事情起作用的,然后我将解释我现在如何拥有一个可用于 .NET 4.8 Razor Pages 或 .NET Core 3.1 Razor Pages 的包。

由于我最初能够让部分页面的 TagHelper 作为我的 ASP.NET Core 3.1 Razor Pages 应用程序的一部分工作,所以我将该 Web 应用程序中的 csproj 文件与我的 ASP.NET 进行了比较核心 3.1 Class 库 csproj 文件。

那时我注意到 ASP.NET Core 3.1 Razor Pages csproj 文件开头为:

<Project Sdk="Microsoft.NET.Sdk.Web>

但是各种Class库项目没有使用以“.Web”结尾的SDK。

因此,我将 ASP.NET Core Class 库 csproj 文件更新为与 ASP.NET Core 3.1 Razor Pages 应用程序相同的 Project Sdk 值。

当我保存 csproj 文件时,它自动将输出类型(在项目属性应用程序选项卡上)更新为控制台应用程序。我将其更改为 Class 库,现在我可以毫无错误地使用部分页面标签助手,所以我的问题 部分 已解决。

这是我的 Class 库的 csproj 文件:

<Project Sdk="Microsoft.NET.Sdk.Web">
    <PropertyGroup>
        <TargetFramework>netcoreapp3.1</TargetFramework>
        <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
        <IsPackable>true</IsPackable>;
        <Version>1.0.5</Version>
        <OutputType>Library</OutputType>
    <PropertyGroup>
</Project>

我之所以说部分解决了我的问题,是因为需要进一步更改才能为 ASP.NET Core 3.1 Razor Pages 以及较低版本的 Razor Pages Web 应用程序(如 .NET Framework 4.8 Razor)提供一个包页面甚至 .NET Core 2.2 Razor 页面。需要做一些事情。

首先将PropertyGroup中的TargetFramework入口替换为TargetFrameworks并添加netstandard2.0:

<TargetFrameworks>netcoreapp3.1;netstandard2.0</TargetFrameworks>

接下来,为 .NET Standard 2.0 TFM(目标框架)所需的 PackageReferences 添加条件 ItemGroup:

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <PackageReference Include="Microsoft.AspNetCore.Mvc.TagHelpers" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.ViewFeatures" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Razor" Version="2.2.0" />
</ItemGroup>

最后,所有 Class 库代码完全相同以支持 ASP.NET Core 3.1 和 .NET Standard 2.0,除了部分页面的自定义标签帮助程序中的一个 using 语句,所以添加条件编译检查如下:

#if NETCOREAPP3_1
using Microsoft.AspNetCore.Mvc.ViewFeatures.Buffers;
#else
using Microsoft.AspNetCore.Mvc.ViewFeatures.Internal;
#endif