【问题标题】:Class Library Tag Helper for Partial Pages not working in ASP.NET Core 3.1 Razor Pages application部分页面的类库标记帮助程序在 ASP.NET Core 3.1 Razor 页面应用程序中不起作用
【发布时间】:2020-09-01 12:48:12
【问题描述】:

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

这就是我在标签助手使用 PartialTagHelper 类呈现部分页面时遇到问题的地方:

TypeLoadException:无法加载类型 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.IViewBufferScope' 来自 程序集'Microsoft.AspNetCore.Mvc.ViewFeatures,版本=3.1.3.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'。

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

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

在 Razor 库中,自定义标记帮助程序代码需要对 Microsoft.AspNetCore.Mvc.ViewFeatures.Internal 命名空间的“使用”引用。

我还尝试使用 .NET Standard 2.0 和 2.1 以及 .NET Core 3.1 类库。在所有这些情况下,类库都需要引用 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 参数。

有没有办法解决这个问题?

谢谢

【问题讨论】:

  • 为什么Razor 类库 而不仅仅是类库 然后创建nuget package?
  • 感谢您的回复。我更新了我的帖子,因为我尝试了各种类型的类库并且在所有情况下都得到相同的错误。我确实做了一个 nuget 包而不是项目引用,但我仍然得到同样的错误。

标签: asp.net-core razor-pages .net-standard renderpartial tag-helpers


【解决方案1】:

一个多星期前(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 for Partial Pages 作为 ASP.NET Core 3.1 Razor Pages 应用程序的一部分工作,因此我将该 Web 应用程序中的 csproj 文件与我的 ASP.NET Core 3.1 类库 csproj 文件进行了比较.

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

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

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

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

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

这是我的类库的 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 Pages 甚至 .NET Framework 4.8 Razor Pages 甚至 . 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>

最后,为了支持 ASP.NET Core 3.1 和 .NET Standard 2.0,所有的类库代码都是完全一样的,除了在 Partial pages 的自定义 Tag Helper 中有一条 using 语句,所以添加条件编译检查如下:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 2020-11-15
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2021-02-13
    • 1970-01-01
    相关资源
    最近更新 更多