本節內容:
ABP提供了一個易用的方式,在你的web應用里嵌入Razor視圖(.cshtml文件)和其它資源(css,js,img...文件).你可以使用這個功能創建包含UI功能的插件/模塊.
首先,我們應當創建一個文件並把它標志為嵌入式資源,任何程序集都可以包含嵌入式資源文件.步驟依項目類型而變.
假設我們有個名為EmbeddedPlugIn的項目:
把Views文件夾的所有文件標志為嵌入式資源,我們可以添加一個如下配置到project.json:
"buildOptions": { "embed": { "include": [ "Views/**/*.*" ] } }
假設我們有個名為EmbeddedPlugIn的項目:
我選中Index.cshtml文件,轉到屬性窗口(快捷鍵為F4)並修改它的"創建操作"為"嵌入式資源":
你應當在你的一個web應用里,為所有你想做為嵌入式資源的文件的創建操作.
我們一旦把文件嵌入到程序集里,我們可以使用啟動配置把它們添加到嵌入式資源管理器,添加如下一行代碼到你模塊的PreInitialize方法里:
Configuration.EmbeddedResources.Sources.Add( new EmbeddedResourceSet( "/Views/", Assembly.GetExecutingAssembly(), "EmbeddedPlugIn.Views" ) );
讓我們解釋一下參數:
- 第一個定義了文件的根目錄(如此處是: http://yourdomain.com/Views/).它匹配根命名空間.
- 第二個程序集包含文件,這個代碼應當定義到包含了嵌入式文件的程序集,否則,你應當依照你的情況修改這個參數.
- 最后一個定義了這些文件在程序集里的根命名空間,這是默認的命名空間(通常是程序集名稱)+程序集里文件的位置,用一個.號連接.
對於.cshtml文件,直接從一個控制器的Action里返回.EmbeddedPlugIn程序集里的BlogController如下所示:
using Abp.AspNetCore.Mvc.Controllers; using Microsoft.AspNetCore.Mvc; namespace EmbeddedPlugIn.Controllers { public class BlogController : AbpController { public ActionResult Index() { return View(); } } }
如你所見,定與通常的controller一樣,如預期地工作.
為使用嵌入式資源(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節.我們也可以如常地使用其它文件(如img).
ASP.NET MVC 5.x 項目將通過Owin自動集成嵌入式資源管理器(只要你的啟動文件如預期的包含app.UseAbp()),對於ASP.NET Core項目,我們應當手動添加app.UseEmbeddedFiles()到啟動類里,並在app.UseStaticFiles()之后:
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或view文件,同樣地,如果模塊A依賴於模塊B,且模塊A使用相同路徑定義了一個嵌入式資源,它就會重寫一個模塊B的嵌入式資源.
注意:對於ASP.NET Core 項目,你應當把重寫文件作為根目錄的wwwroot文件夾下.