用于asp.net Core 1.1的外部程序集中的嵌入式样式表

时间:2017-06-05 18:38:27

标签: asp.net-core asp.net-core-mvc embedded-resource

我正在使用 VS.2017社区版 15.2更新(26430.12)在我的解决方案中我有一个主 ASP.NET Core 1.1 Web应用程序和一个单独的程序集,它是一个.NET Core类库我已经装配好了,因此它是Web SDK作为类库,并从我提供视图组件到主Web应用程序。这很好。

但是,我刚刚添加了几个部分视图(可能稍后查看组件),但这两个特别需要包含样式表(CSS)文件。由于我希望所有内容都像可视组件一样自包含,因此我创建了一个wwwroot \ css文件夹,其中我将我的CSS设置为嵌入式资源。

问题是....在我的主要Web应用程序中,如果样式表嵌入在外部程序集中,我如何在ASP.NET Core _Layout文件中传输该样式表?

2 个答案:

答案 0 :(得分:1)

基于docs ,我认为理论上你可以将嵌入式文件提供程序添加到静态文件中间件中,如下所示:

var embeddedFiles = new EmbeddedFileProvider(
                typeof(yourtype).GetTypeInfo().Assembly,
                "your.assembly.name"
            );

builder.UseStaticFiles(new StaticFileOptions()
{
    FileProvider = embeddedFiles
    //,RequestPath = new PathString("/files") // optionally use a path other than /
});

如果这种方式有效,那可能是最好的,但我自己没有尝试过,所以不是100%确定有效。目前在我的项目中,我刚刚添加了控制器操作,返回我的嵌入式静态资源,您可以在我的FileManagerController

中的css,js和fonts动作方法中看到这些资源。

我的FileManagerController需要css和js以及字体,所以我有每个操作方法和私有帮助器操作方法。它有效,但是当我有机会时,我会尝试另一种方式,因为它会少得多的代码。 我的资源的网址就像[控制器] /动作所以filemanager / css,filemanager / js,filemanager / fonts就像我的情况一样。

更新2017-06-09:我现在已经使用StaticFiles Middleware方法在我自己的项目中实现了服务嵌入式静态资源。我可以确认它一般有效,但是如果嵌入式资源有任何 - 在文件夹段中找不到资源,则存在问题 - 因为 - 在文件夹段中需要更改为_以查找资源但是 - 在文件名中是正常的。 EmbeddedFileProvider无法处理此问题,因此我报告了一个问题here并在我的项目中使用custom IFileProvider解决了该问题。

如上所述,也可以从控制器操作提供静态资源,但MVC在认证/授权中间件之后运行,结果是那些中间件在处理静态文件请求时运行,这可以使用以前运行的静态文件中间件来避免那。我想如果需要保护嵌入式静态资源,那么使用控制器操作将是一种方法,但我不需要它。

答案 1 :(得分:1)

嗯,到目前为止,对我来说,这个.NET Core的东西让我的生活更加复杂,而不是让它变得更容易。无论如何,我设法让CSS文件驻留在同一个外部程序集中,其中(外部)视图组件嵌入在我的_Layout中。

首先,我向主Web应用程序的 SampleAPI API控制器添加了一个新的API方法。此API方法检索外部程序集中的嵌入资源并获取其流。

让我们说外部程序集的完整命名空间,其中嵌入了需要自定义CSS的视图组件具有命名空间 ExternalAssembly ,并且我在那里定义了我的组件及其CSS文件。为清楚起见,我省略了全视图组件。

ExternalAssembly.proj
     css\
        my-view-component.css
     ViewComponents\
        MyViewComponent.cs
     Views\
        Shared\
           Components\
              MyViewComponent\
                  Default.cshtml

Default.cshtml文件和CSS文件在项目中标记为嵌入式资源

API控制器上的API方法如下所示,我的应用程序是 ASP.NET Core 1.1 MVC ,但也有API。 API方法负责将CSS文件作为流返回,以便在布局页面中使用:

[HttpGet("cssMyViewComponent")]
public IActionResult GetCss(string id) {
    var stream = typeof(ExternalAssembly.ViewComponents.MyViewComponent)
 .GetTypeInfo().Assembly
 .GetManifestResourceStream("ExternalAssembly.css.my-view-component.css");
}

确保获取嵌入资源的实际名称,请注意css文件夹名称是该资源的完整命名空间的一部分。如果不确定您可以使用ILDASM打开外部程序集并查找资源名称。

最后但并非最不重要的是,我使用API​​方法的名称和为其定义的路径,像这样引用 _Layout.cshtml 中的CSS:

<link rel="stylesheet" href="~/api/SampleAPI/cssMyViewComponent" />