为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
长风秋雁 2021-11-07 20:27:32
也许这已经是重复的了,但是由于该帖子没有任何答案,所以我发布了这个问题。新的Razor 类库很棒,但它不能打包库文件(如 jQuery、共享 CSS)。我能否以某种方式在多个 Razor Page 项目中重用 CSS,使用 Razor 类库或其他任何东西(我的目的是,多个网站使用相同的 CSS,并且单个更改适用于所有项目)。我曾尝试wwwroot在 Razor 类库项目中创建文件夹,但它没有按预期工作(我可以理解为什么它不应该工作)。
查看完整描述

3 回答

?
梦里花落0921

TA贡献1772条经验 获得超6个赞

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/ 处的静态内容的路径。


查看完整回答
反对 回复 2021-11-07
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

您需要将静态资产嵌入到 Razor 类库程序集中。我认为最好的方法是查看ASP.NET Identity UI 源代码。


您应该采取以下 4 个步骤来嵌入您的资产并为其提供服务。


编辑 Razor 类库的 csproj 文件并添加以下行。


 <PropertyGroup>

  ....

       <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>

  ....

 </PropertyGroup>


 <ItemGroup>

     ....

     <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.1.2" />

     <PackageReference Include="Microsoft.AspNetCore.StaticFiles" Version="2.1.1" />

     <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="2.1.1" />

     <PackageReference Include="Microsoft.NET.Sdk.Razor" Version="$(MicrosoftNETSdkRazorPackageVersion)" PrivateAssets="All" />

    .....

 </ItemGroup>


<ItemGroup>

    <EmbeddedResource Include="wwwroot\**\*" />

    <Content Update="**\*.cshtml" Pack="false" />

</ItemGroup>

在您的 Razor 类库中,创建以下类来提供和路由资产。(假设您的资产位于 wwwroot 文件夹中)


public class UIConfigureOptions : IPostConfigureOptions<StaticFileOptions>

{

    public UIConfigureOptions(IHostingEnvironment environment)

    {

        Environment = environment;

    }

    public IHostingEnvironment Environment { get; }


    public void PostConfigure(string name, StaticFileOptions options)

    {

        name = name ?? throw new ArgumentNullException(nameof(name));

        options = options ?? throw new ArgumentNullException(nameof(options));


        // Basic initialization in case the options weren't initialized by any other component

        options.ContentTypeProvider = options.ContentTypeProvider ?? new FileExtensionContentTypeProvider();

        if (options.FileProvider == null && Environment.WebRootFileProvider == null)

        {

            throw new InvalidOperationException("Missing FileProvider.");

        }


        options.FileProvider = options.FileProvider ?? Environment.WebRootFileProvider;


        var basePath = "wwwroot";


        var filesProvider = new ManifestEmbeddedFileProvider(GetType().Assembly, basePath);

        options.FileProvider = new CompositeFileProvider(options.FileProvider, filesProvider);

    }

}

使依赖 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>


查看完整回答
反对 回复 2021-11-07
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

在 .NET Core 3.1 中,RCL 将 wwwroot 文件夹中的资产包含在 _content/{LIBRARY NAME} 下的消费应用程序中。


我们可以通过编辑 RCL 项目属性并放置StaticWebAssetBasePath将 _content/{LIBRARY NAME} 路径更改为不同的路径名。


PropertyGroup>

    <StaticWebAssetBasePath Condition="$(StaticWebAssetBasePath) == ''">/path</StaticWebAssetBasePath>

  </PropertyGroup>

现在您可以使用 /path/test.js 访问文件。


查看完整回答
反对 回复 2021-11-07
  • 3 回答
  • 0 关注
  • 307 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信