6.10 嵌入式资源
6.10.1 简介
在Web应用程序中,ABP提供了一个简单的方法来使用嵌入式的 Razor视图(.cshtml文件)和 其它资源(css,js,img等文件)。你可以使用该功能来创建包含UI功能的插件/模块。
6.10.2 创建嵌入式文件
首先,我们应该创建一个文件并且标记它为 嵌入式资源。任何程序集都可以包含嵌入式资源文件。至于如何标记它,这要看你的项目是什么格式的。
项目格式为:xproj/project.json
假设,我们有个EmbeddedPlugIn的项目;如下所示:
为了使处于 Views 文件夹下 所有文件 作为嵌入式资源,我们需要在 project.json 添加如下配置:
"buildOptions": {
"embed": {
"include": [
"Views/**/*.*"
]
}
}
项目格式为:csproj
假设,我们有个EmbeddedPlugIn的项目;如下所示:
选中 index.cshtml 文件,然后打开属性窗口(快捷键:F4),更改 生成操作 的值为 嵌入式资源。
你可以使那些你想在web应用程序中使用所有文件标记为嵌入式资源。
6.10.3 添加嵌入资源管理器
当这些文件嵌入进程序集以后,我们可以使用启动配置来添加嵌入资源管理器。你可以在模块的PreInitialize方法中添加如下代码:
Configuration.EmbeddedResources.Sources.Add(
new EmbeddedResourceSet(
"/Views/",
Assembly.GetExecutingAssembly(),
"EmbeddedPlugIn.Views"
)
);
参数注解:
第一个参数定义的是文件的 根目录(如同:http://yourdomain.com/ Views/)。它匹配根名称空间。
第二个参数定义的是包含这些嵌入资源的 程序集。这段代码应该位于包含嵌入资源的程序集中。否则,你应该相应的改变这个参数。
最后一个参数定义的是文件所处程序集的 根名称空间。这是默认名称空间(通常是程序集的名字)+点+所处程序集的文件夹名字,如上所示:EmbeddedPlugIn.Views。
6.10.4 消费嵌入视图
对于 .cshtml 文件,它直接从控制器的Actin中返回。下面展示的是一个在EmbeddedPlugIn程序集中的BlogController控制器:
using Abp.AspNetCore.Mvc.Controllers;
using Microsoft.AspNetCore.Mvc;
namespace EmbeddedPlugIn.Controllers
{
public class BlogController : AbpController
{
public ActionResult Index()
{
return View();
}
}
}
如你所见,它如常规控制器一样按你预期的那样工作。
6.10.5 消费嵌入式资源
为了消费嵌入式资源(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>
假设这个主应用程序有Styles和Scripts的section。我们也可以像通常那样做的一样使用其它文件(如图片文件)。
6.10.6 配置ASP.NET Core
ASP.NET MVC 5.x项目会通过Owin(如果你的startup文件包含这行代码:app.UseAbp())自动的集成嵌入式资源管理器。但是,对于ASP.NET Core项目,我们需要手动添加 app.UseEmbeddedFiles() 到Startup类中,随后添加 app.UseStaticFiles()。如下所示:
app.UseStaticFiles();
app.UseEmbeddedFiles(); //允许暴露嵌入式文件到web中!
文件忽略
通常,在嵌入式资源管理器中的所有文件如同静态文件一样被客户端直接消费。以安全或其它意图为目的,我们可以忽略某些扩展名文件。.cshtml和.config 文件默认是被忽略的(来自客户端的直接请求)。你可以在模块的PreInitialize方法中添加更多的扩展名;如下所示:
Configuration.Modules.AbpWebCommon().EmbeddedResources.IgnoredFileExtensions.Add("exe");
6.10.7 重写嵌入式文件
注意:嵌入式资源是可以被更高级的模块给覆盖掉的。这意味着你可以在web应用程序中,使用同名文件夹(与嵌入式资源文件夹名相同),并创建同名文件(与嵌入式资源文件名相同)来覆盖掉嵌入式资源(在web应用程序中的文件不需要设置为嵌入式资源,因为静态文件的优先级高于嵌入式文件)。因此,你可以覆盖掉你应用程序中的插件/模块的css,js以及视图文件。还有,如果模块A依赖于模块B,并且模块A定义了某个相同路径的资源文件,那么它可以覆盖掉模块B的资源文件。
注意:对于ASP.NET Core项目,你应该把覆盖文件放在作为根路径的wwwroot文件夹中。