将wwwroot的内容从类库复制到托管程序集

时间:2020-10-19 20:34:12

标签: asp.net-core razor blazor razor-pages blazor-server-side

我有一个razor类库,其中包含wwwroot文件夹和一些静态资产(我们称其为MyWeb.Reports项目,因为它将用于使用razor作为生成器来创建静态HTML报告)。

我还拥有使用该dll的asp.net核心托管应用程序(简称为MyWeb)(引用首先提到了Visual Studio-MyWeb.Reports内部的项目)。类库的目的是生成静态HTML文件(它呈现剃刀组件)

我希望能够将HTML内部的CSS呈现为内联字符串,因为HTML文件必须是标准文件(一旦呈现html,就不会再向任何服务器发出其他请求了。)

我的想法是在剃刀组件中使用类似File.ReadAllText(“〜/ styles.css”)这样的东西。 如果styles.css位于asp.net核心Web应用程序的wwwroot文件夹中,则将起作用。

在Web应用程序内部具有组件库的CSS,而在类库内部具有组件的CSS感觉很奇怪。

请记住,我不是在这里创建Web应用程序的(Web应用程序项目中没有组件)。 只是为了调用Web.Reports.dll即可生成HTML,而MyWeb只是具有将返回生成的字符串(流)的控制器。

是否可以将wwwroot从引用的项目复制到实际托管的项目中?

1 个答案:

答案 0 :(得分:1)

本文https://dotnetstories.com/blog/How-to-Include-static-files-in-a-Razor-library-en-7156675136介绍了如何从Razor类库访问文件。

在您的剃须刀类库csproj中:

  1. 添加GenerateEmbeddedFilesManifest标志
  2. 参考Microsoft.Extensions.FileProviders.Embedded
  3. 将wwwroot包含为EmbeddedResource

示例:

<PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly" Version="5.0.0-rc.2.*" />
    <PackageReference Include="Microsoft.AspNetCore.Components.WebAssembly.DevServer" Version="5.0.0-rc.2.*" PrivateAssets="all" />
    <PackageReference Include="System.Net.Http.Json" Version="5.0.0-rc.2.*" />
    <PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" Version="5.0.0-rc.2.*" />  

  </ItemGroup>

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

然后您可以执行以下操作:

var assembly = typeof(Library.Class1).Assembly;
var filePaths = assembly.GetManifestResourceNames().Where(rnn => rnn.Contains("wwwroot"));

foreach (var path in filePaths)
{
   Console.WriteLine(path);
}