注意:文中使用的是 razor pages ,建議使用 razor views ,使用 razor pages 有一個小坑,razor pages 會用到 {page} 路由參數,如果應用中也用到了這個路由參數,會造成沖突。
Razor Class Library 是 ASP.NET Core 2.1 的新特性,可以將 MVC 視圖編譯為程序集供其他項目引用,詳見 Create reusable UI using the Razor Class Library project in ASP.NET Core
之前我們為了實現在各個項目中共用自定義錯誤頁面,通過“中間件+字符串拼接頁面html”的方式實現了一個公用類庫,但實現復雜,頁面維護很不方便。
Razor Class Library 正好可以解決我們的這個心頭之痛,趁着今天 .NET Core 2.1 正式版發布 之熱,體驗一下這個新特性。
直接在現有的類庫項目中修改,先在 .csproj 中將 <Project Sdk="Microsoft.NET.Sdk"> 改為 <Project Sdk="Microsoft.NET.Sdk.Razor"> ,並 nuget 安裝 Microsoft.AspNetCore.Mvc 。
接着創建 Pages/Errors 文件夾,並在其中添加 400.cshtml, 404.cshtml, 500.cshtml 這 3 個 Razor Page 文件。
這時如果在解決方案中另外添加一個 web 項目,引用這個 RCL 類庫項目后,就可以通過 /Error/404 這樣的路徑直接訪問自定義錯誤頁面了,封裝在類庫中的視圖生效了。
啟用這些自定義錯誤頁面需要在 Startup 的 Configure 方法中添加如下的代碼:
app.UseExceptionHandler("/Errors/500"); app.UseStatusCodePagesWithReExecute("/Errors/{0}");
為了使用方便,實現一個擴展方法:
public static class CustomErrorPagesExtensions { public static IApplicationBuilder UseCustomErrorPages(this IApplicationBuilder app) { app.UseExceptionHandler("/Errors/500"); app.UseStatusCodePagesWithReExecute("/Errors/{0}"); return app; } }
然后發布 nuget 包,需要用的項目安裝 nuget 包,在 Startup 的 Configure 中添加 app.UseCustomErrorPages() 即可。
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseCustomErrorPages(); } }
用 Razor Class Library 實現不僅以后維護方便,而且超級簡單清爽,贊嘆 RCL 的同時將之前的一堆代碼全丟進了垃圾桶。