嵌入式资源文件

介绍

ASP.NET Boilerplate提供了一种在Web应用程序中使用嵌入式Razor视图(.cshtml文件)和其他资源(css,js,img ...文件)的简便方法。您可以使用此功能来创建   包含UI功能的插件/模块

创建嵌入式文件

首先,我们创建一个文件并将其标记为嵌入式资源。任何程序集都可以包含嵌入的资源文 该过程根据您的项目格式而变化。

xproj / project.json格式

假设我们有一个名为EmbeddedPlugIn的项目,如下所示:

嵌入式资源示例项目

要使Views文件夹下的所有文件都嵌入资源,我们将以下配置添加到project.json:

  "buildOptions": {
    "embed": {
      "include": [
        "Views/**/*.*"
      ]
    }
  }

csproj格式

假设我们有一个名为EmbeddedPlugIn的项目,如下所示:

嵌入式资源项目结构

选择Index.cshtml文件,转到属性窗口(shorcut是F4)并将其Build Action更改为Embedded Resource。

将文件嵌入到ac#项目中

您应该将构建操作更改为要在Web应用程序中使用的所有文件的嵌入资源。

添加到嵌入式资源管理器

一旦我们将文件嵌入到程序集中,我们就可以使用  启动配置  将它们添加到嵌入式资源管理器中。您可以将这样的行添加到模块的PreInitialize方法中  

Configuration.EmbeddedResources.Sources.Add(
    new EmbeddedResourceSet(
        "/Views/",
        Assembly.GetExecutingAssembly(),
        "EmbeddedPlugIn.Views"
    )
);

我们来解释一下这些参数:

使用嵌入式视图

对于.cshtml文件,可以直接从Controller Action返回它们。EmbeddedPlugIn程序集中的BlogController如下所示:

using Abp.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc;

namespace EmbeddedPlugIn.Controllers
{
    public class BlogController : AbpController
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

正如您所看到的,它与常规控制器相同,并且按预期工作。

使用嵌入式资源

要使用嵌入式资源(js,css,img ...),我们可以像往常一样在视图中使用它们:

@section Styles {
    <link href="~/Views/Blog/Index.css" rel="stylesheet" />
}

@section Scripts
{
    <script src="~/Views/Blog/Index.js"></script>
}

<h2 id="BlogTitle">Blog plugin!</h2>

它假定主应用程序具有样式和脚本部分。我们也可以像平常一样使用其他文件,比如图像。

ASP.NET核心配置

ASP.NET MVC 5.x项目将通过Owin自动集成到嵌入式资源管理器(如果您的启动文件包含预期的app.UseAbp())。对于ASP.NET Core项目,我们必须在app.UseStaticFiles()之后手动将app.UseEmbeddedFiles()添加到Startup类,如下所示:

app.UseStaticFiles();
app.UseEmbeddedFiles(); //Allows to expose embedded files to the web!

忽略的文件

通常,嵌入式资源管理器中的所有文件都可以由客户端直接使用,就像它们是静态文件一样。出于安全性和其他目的,您可以忽略某些文件扩展名。默认情况下会忽略.cshtml和.config文件(对于来自客户端的直接请求)。您可以在模块的PreInitialize方法中添加更多扩展,如下所示:

Configuration.Modules.AbpWebCommon().EmbeddedResources.IgnoredFileExtensions.Add("exe");

覆盖嵌入式文件

嵌入式资源文件的一个重要特性是它们可以被更高级的模块覆盖。这意味着您可以在Web应用程序的同一文件夹中创建具有相同名称的文件以覆盖嵌入式文件(您的Web应用程序中的文件不要求它是嵌入式资源,因为静态文件优先于嵌入式文件) 。因此,您可以覆盖应用程序中模块/插件的css,js或视图文件。如果模块A依赖于模块B并且模块A定义具有相同路径的嵌入资源,则它将覆盖模块B的嵌入资源文件。

注意:对于ASP.NET Core项目,您应该将重写文件放在wwwroot文件夹中作为根路径。

nidie.com.cn - 用心与你沟通