\[已解决\] 我的 ASP 项目无法访问我创建的 NuGet 包中的类

问题描述 投票:0回答:1

解决方案:

正如@Zhi Lv提到的,我必须清除缓存。

我选择手动转到

C:\Users\<username>\.nuget\packages\
并删除包含我的包的文件夹(在本例中为名为:
RazorClassLibraryTest
)的文件夹,而不是清除所有包的缓存。


问题:

所以我正在尝试创建 NuGet 包,这个包有一个标签助手和一个

IApplicationBuilder
的扩展方法,我打包了该包并将其放入本地文件夹中,将该文件夹添加到包源中,然后安装了该包.

包项目结构:

TagHelperNuGet/
├── wwwroot/
│   ├── css/
│   │   └── style.cs
│   └── js/
│       └── script.js
├── TagHelpers/
│   └── BtnTagHelper.cs
└── Extensions/
    └── StaticFileExtension.cs

标签助手被识别(添加

@addTagHelper *, RazorClassLibraryTest
ofc 后),但扩展方法没有被识别。

当我尝试在我的

Program.cs
文件中导入名称空间时

using RazorClassLibraryTest.Extensions;

我明白了

The type or namespace name 'Extensions' does not exist in the namespace 'RazorClassLibraryTest' (are you missing an assembly reference?)

但是当我对标签助手名称空间执行相同操作时,它会毫无问题地导入

using RazorClassLibraryTest.TagHelpers;

这是两个文件的代码:

AlertBtnTagHleper.cs

using Microsoft.AspNetCore.Razor.TagHelpers;

namespace RazorClassLibraryTest.TagHelpers
{
    [HtmlTargetElement("alert-btn")]
    public class AlertBtnTagHelper : TagHelper
    {
        [HtmlAttributeName("text")]
        public string Text { get; set; } = "Show Alert";
        [HtmlAttributeName("message")]
        public string Message { get; set; } = "Hello World!";

        public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            output.TagName = "button";
            output.Attributes.SetAttribute("type", "button");
            output.Attributes.SetAttribute("class", "btn-alert");
            output.Attributes.SetAttribute("onclick", $"showAlert('{Message}')");
            output.Content.SetContent(Text);
        }
    }
}

StaticFilesExtention.cs

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using System.Reflection;

namespace RazorClassLibraryTest.Extensions
{
    public static class StaticFilesExtension
    {
        /// <summary>
        /// Configures the application to serve static files from a specified staticFilesRoot path.
        /// </summary>
        /// <param name="app">The application builder.</param>
        /// <param name="staticFilesRoot">The staticFilesRoot path to serve static files from. Defaults to <c>_content/RazorClassLibraryTest/</c>.</param>
        /// <returns>The application builder.</returns>
        public static IApplicationBuilder UseTagStatics(this IApplicationBuilder app, string? staticFilesRoot)
        {
            if (string.IsNullOrWhiteSpace(staticFilesRoot))
                return app;

            app.Use(async (context, next) =>
            {
                if (context.Request.Path.StartsWithSegments(staticFilesRoot))
                {
                    Assembly assembly = Assembly.GetAssembly(typeof(StaticFilesExtension))!;
                    string? assemblyName = assembly.GetName().Name;

                    if (string.IsNullOrWhiteSpace(assemblyName))
                        throw new InvalidOperationException("The assembly name could not be determined.");

                    string assetPath = context.Request.Path.Value[(staticFilesRoot.Length + 1)..];

                    context.Request.Path = $"/_content/{assemblyName}/{assetPath}";
                }
                await next();
            });

            return app;
        }

        /// <summary>
        /// Configures the application to serve static files from a path specified in the configuration.
        /// </summary>
        /// <param name="app">The application builder.</param>
        /// <param name="configuration">The configuration to get the staticFilesRoot path from. Expects the value to be stored in "RazorTag.StaticFilesRoot".</param>
        /// <returns>The application builder.</returns>
        public static IApplicationBuilder UseTagStatics(this IApplicationBuilder app, IConfiguration configuration)
        {
            string? configStaticFilesRoot = configuration["RazorTag:StaticFilesRoot"];

            if (string.IsNullOrWhiteSpace(configStaticFilesRoot))
                return app;

            return app.UseTagStatics(configStaticFilesRoot);
        }
    }
}

欢迎代码审查和改进建议,谢谢。

编辑:

扩展已打包但仍然无法使用 使用 DotPeek 应用程序的包结构图像

编辑2:

代码来自

.csproj

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

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <Nullable>enable</Nullable>
    <ImplicitUsings>enable</ImplicitUsings>
    <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Components.Web" Version="8.0.11" />
    <PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Razor" Version="2.3.0" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="2.2.0" />
  </ItemGroup>
</Project>
c# asp.net-core .net-core nuget-package extension-methods
1个回答
0
投票

由于您启用了

GeneratePackageOnBuild
,因此在构建应用程序时,默认情况下它将在
{project folder}/bin/Debug folder
中生成.nupkg文件。所以问题可能与生成文件有关,它不是最新版本。

尝试打开项目文件夹并删除bin文件夹,然后重建应用程序并获取最新版本。

然后您可以尝试参考以下步骤从本地源安装Nuget包。

  1. 右键单击您的项目,选择“Manange NuGet Package...”选项。

  2. 在NeGet面板中点击Settings图标,在弹出的窗口中点击add按钮新建一个包源,设置Name并将源设置为你本地文件夹的路径({你的项目文件夹/bin/Debug }).

    add local source

  3. 然后更改Package Source,您可以找到本地的.nupkg包,然后您可以将其安装到您的应用程序中。

    select package source

    之后就可以使用相关的类了。你可以尝试一下。

更新:

从本地包源安装nuget包后,我们可以从这里找到包:

installed package

然后,使用 StaticFilesExtension:

use static file

要使用自定义 TagHelper,我可以在 _ViewImports.cshtml 中添加命名空间引用,然后使用自定义标记。

custom tag helper

正如我们所见,我们可以同时使用它们。

当我测试您的代码时,遇到

showAlert
未定义错误,在我将类库中的
showAlert
更改为
alert
后,它继续显示
showAlert
未定义错误。出现此问题的原因是我们没有更新软件包,这可能与您的问题类似。所以,在我之前的回复中,我建议你删除bin文件夹并重新生成包,然后安装最新的包。

此外,NuGet 缓存可能会阻止我们安装更新的包,您可以尝试清除 NuGet 缓存(使用“工具”>“NuGet 包管理器”>“包管理器设置”菜单命令,然后选择“清除所有 NuGet 缓存”并重新安装软件包。

© www.soinside.com 2019 - 2024. All rights reserved.