解决方案:
正如@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>
由于您启用了
GeneratePackageOnBuild
,因此在构建应用程序时,默认情况下它将在{project folder}/bin/Debug folder
中生成.nupkg文件。所以问题可能与生成文件有关,它不是最新版本。
尝试打开项目文件夹并删除bin文件夹,然后重建应用程序并获取最新版本。
然后您可以尝试参考以下步骤从本地源安装Nuget包。
右键单击您的项目,选择“Manange NuGet Package...”选项。
在NeGet面板中点击Settings图标,在弹出的窗口中点击add按钮新建一个包源,设置Name并将源设置为你本地文件夹的路径({你的项目文件夹/bin/Debug }).
然后更改Package Source,您可以找到本地的.nupkg包,然后您可以将其安装到您的应用程序中。
之后就可以使用相关的类了。你可以尝试一下。
更新:
从本地包源安装nuget包后,我们可以从这里找到包:
然后,使用 StaticFilesExtension:
要使用自定义 TagHelper,我可以在 _ViewImports.cshtml 中添加命名空间引用,然后使用自定义标记。
正如我们所见,我们可以同时使用它们。
当我测试您的代码时,遇到
showAlert
未定义错误,在我将类库中的showAlert
更改为alert
后,它继续显示showAlert
未定义错误。出现此问题的原因是我们没有更新软件包,这可能与您的问题类似。所以,在我之前的回复中,我建议你删除bin文件夹并重新生成包,然后安装最新的包。
此外,NuGet 缓存可能会阻止我们安装更新的包,您可以尝试清除 NuGet 缓存(使用“工具”>“NuGet 包管理器”>“包管理器设置”菜单命令,然后选择“清除所有 NuGet 缓存”并重新安装软件包。