Razor 类库也可以打包静态文件(js、css 等)吗?

也许已经是重复的了,但是由于该帖子没有任何答案,所以我发布了这个问题。

新的Razor 类库很棒,但它不能打包库文件(如 jQuery、共享 CSS)。

我能否以某种方式在多个 Razor Page 项目中重用 CSS,使用 Razor 类库或其他任何东西(我的目的是,多个网站使用相同的 CSS,并且单个更改适用于所有项目)。

我曾尝试wwwroot在 Razor 类库项目中创建文件夹,但它没有按预期工作(我可以理解为什么它不应该工作)。


长风秋雁
浏览 308回答 3
3回答

梦里花落0921

Ehsan 的回答在询问时是正确的(对于 .NET Core 2.2),对于 .NET Core 3.0,RCL 可以毫不费力地包含静态资产:要将配套资产作为 RCL 的一部分包含在内,请在类库中创建一个 wwwroot 文件夹,并在该文件夹中包含任何必需的文件。打包 RCL 时,wwwroot 文件夹中的所有配套资产都会自动包含在包中。RCL 的 wwwroot 文件夹中包含的文件以前缀 _content/{LIBRARY NAME}/ 向消费应用程序公开。例如,名为 Razor.Class.Lib 的库会生成指向 _content/Razor.Class.Lib/ 处的静态内容的路径。

Cats萌萌

您需要将静态资产嵌入到 Razor 类库程序集中。我认为最好的方法是查看ASP.NET Identity UI 源代码。您应该采取以下 4 个步骤来嵌入您的资产并为其提供服务。编辑 Razor 类库的 csproj 文件并添加以下行。&nbsp;<PropertyGroup>&nbsp; ....&nbsp; &nbsp; &nbsp; &nbsp;<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>&nbsp; ....&nbsp;</PropertyGroup>&nbsp;<ItemGroup>&nbsp; &nbsp; &nbsp;....&nbsp; &nbsp; &nbsp;<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.2" />&nbsp; &nbsp; &nbsp;<PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.1.1" />&nbsp; &nbsp; &nbsp;<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.1.1" />&nbsp; &nbsp; &nbsp;<PackageReference Include="Microsoft.NET.Sdk.Razor" Version="$(MicrosoftNETSdkRazorPackageVersion)" PrivateAssets="All" />&nbsp; &nbsp; .....&nbsp;</ItemGroup><ItemGroup>&nbsp; &nbsp; <EmbeddedResource Include="wwwroot\**\*" />&nbsp; &nbsp; <Content Update="**\*.cshtml" Pack="false" /></ItemGroup>在您的 Razor 类库中,创建以下类来提供和路由资产。(假设您的资产位于 wwwroot 文件夹中)public class UIConfigureOptions : IPostConfigureOptions<StaticFileOptions>{&nbsp; &nbsp; public UIConfigureOptions(IHostingEnvironment environment)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Environment = environment;&nbsp; &nbsp; }&nbsp; &nbsp; public IHostingEnvironment Environment { get; }&nbsp; &nbsp; public void PostConfigure(string name, StaticFileOptions options)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; name = name ?? throw new ArgumentNullException(nameof(name));&nbsp; &nbsp; &nbsp; &nbsp; options = options ?? throw new ArgumentNullException(nameof(options));&nbsp; &nbsp; &nbsp; &nbsp; // Basic initialization in case the options weren't initialized by any other component&nbsp; &nbsp; &nbsp; &nbsp; options.ContentTypeProvider = options.ContentTypeProvider ?? new FileExtensionContentTypeProvider();&nbsp; &nbsp; &nbsp; &nbsp; if (options.FileProvider == null && Environment.WebRootFileProvider == null)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; throw new InvalidOperationException("Missing FileProvider.");&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; options.FileProvider = options.FileProvider ?? Environment.WebRootFileProvider;&nbsp; &nbsp; &nbsp; &nbsp; var basePath = "wwwroot";&nbsp; &nbsp; &nbsp; &nbsp; var filesProvider = new ManifestEmbeddedFileProvider(GetType().Assembly, basePath);&nbsp; &nbsp; &nbsp; &nbsp; options.FileProvider = new CompositeFileProvider(options.FileProvider, filesProvider);&nbsp; &nbsp; }}使依赖 Web 应用程序使用您的 Razor 类库路由器。在Startup Class的ConfigureServices方法中,添加以下行。services.ConfigureOptions(typeof(UIConfigureOptions));因此,现在您可以添加对文件的引用。(假设它位于 wwwroot/js/app.bundle.js)。<script src="~/js/app.bundle.js" asp-append-version="true"></script>

慕勒3428872

在 .NET Core 3.1 中,RCL 将 wwwroot 文件夹中的资产包含在 _content/{LIBRARY NAME} 下的消费应用程序中。我们可以通过编辑 RCL 项目属性并放置StaticWebAssetBasePath将 _content/{LIBRARY NAME} 路径更改为不同的路径名。PropertyGroup>&nbsp; &nbsp; <StaticWebAssetBasePath Condition="$(StaticWebAssetBasePath) == ''">/path</StaticWebAssetBasePath>&nbsp; </PropertyGroup>现在您可以使用 /path/test.js 访问文件。
打开App,查看更多内容
随时随地看视频慕课网APP