接着上篇講asp.net core 系列 7 Razor框架路由。在上篇繼續第三節 "頁面路由操做約定" 的最後一小節 AddPageRoute 。html
使用 AddPageRoute 配置路由,該路由與指定頁面關聯, 使用指定的路由生成頁面連接。 AddPageRoute 使用 AddPageRouteModelConvention 創建路由。框架
示例應用爲 Privacy.cshtml 建立指向 /ThePrivacyPage 的路由:asp.net
options.Conventions.AddPageRoute("/Privacy", "ThePrivacyPage/{text?}");
能夠經過原有 /
Privacy默認路由訪問「Privacy」頁面。http://localhost:60397/Privacy異步
也能夠經過上面自定義的頁面路由訪問Privacy頁面。 http://localhost:60397/ThePrivacyPageasync
示例應用的「Privacy」頁面自定義路由容許使用可選的 text
路由段 ({text?}
)。 該頁面還在其 @page
指令中包含此可選段,以便訪問者在 /
Privacy 路由中訪問該頁面。在呈現的頁面中,爲Privacy連接生成的 URL 顯示了已更新的路由,以下所示:ide
實現 IPageApplicationModelProvider 的默認頁面模型提供程序可調用約定,這些約定旨在爲頁面模型配置提供擴展點。 在生成和修改頁面發現及處理方案時,可以使用這些約定。這裏繼續使用上篇講的 AddHeaderAttribute
類(一個ResultFilterAttribute)來應用響應標頭。post
使用 AddFolderApplicationModelConvention 建立並添加 IPageApplicationModelConvention,後者能夠爲指定文件夾下的全部頁面調用 PageApplicationModel 實例上的操做。 示例演示瞭如何使用 AddFolderApplicationModelConvention
將標頭 OtherPagesHeader
添加到應用的OtherPages 文件夾內的頁面:spa
//文件夾應用模型約定 options.Conventions.AddFolderApplicationModelConvention("/OtherPages", model => { model.Filters.Add(new AddHeaderAttribute( "OtherPagesHeader", new string[] { "OtherPages Header Value" })); });
在OtherPages/Page1
中請求示例的 Page1 頁面,並檢查標頭以查看結果:.net
使用AddPageApplicationModelConvention建立並添加IPageApplicationModelConvention ,它在調用操做PageApplicationModel頁使用指定的名稱。示例演示瞭如何使用 AddPageApplicationModelConvention 將標頭 AboutHeader 添加到「About」頁面:3d
//頁面應用模型約定 options.Conventions.AddPageApplicationModelConvention("/Privacy", model => { model.Filters.Add(new AddHeaderAttribute( "PrivacyHeader", new string[] { "Privacy Header Value" })); });
請求示例的 Privacy頁面,並檢查標頭以查看結果:
ConfigureFilter 可配置要應用的指定篩選器。 用戶能夠實現篩選器類,但示例應用演示瞭如何在 Lambda 表達式中實現篩選器,該篩選器在後臺做爲可返回篩選器的工廠實現:
options.Conventions.ConfigureFilter(model => { if (model.RelativePath.Contains("OtherPages/Page2")) { return new AddHeaderAttribute( "OtherPagesPage2Header", new string[] { "OtherPages/Page2 Header Value" }); } return new Pages.OtherPages.EmptyFilter(); });
public class EmptyFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { // do something before the action executes } public void OnActionExecuted(ActionExecutedContext context) { // do something after the action executes } }
頁面應用模型用於檢查指向 OtherPages 文件夾中 Page2 頁面的段的相對路徑。 若是條件經過,則添加標頭。 若是不經過,則應用 EmptyFilter
。因爲 Razor 頁面會忽略操做篩選器,所以,若是路徑不包含 OtherPages/Page2
,EmptyFilter
會按預期發出空操做指令。
在OtherPages/Page2中請求示例的 Page2 頁面,並檢查標頭以查看結果:
除了4.3的 Lambda 表達式配置篩選器。還能夠對ConfigureFilter 配置指定的工廠,以將篩選器應用於全部 Razor 頁面。示例應用說明如何使用篩選器工廠將具備兩個值的標頭 FilterFactoryHeader 添加到應用的頁面:
options.Conventions.ConfigureFilter(new AddHeaderWithFactory());
public class AddHeaderWithFactory : IFilterFactory { // Implement IFilterFactory public IFilterMetadata CreateInstance(IServiceProvider serviceProvider) { return new AddHeaderFilter(); } /// <summary> /// IResultFilter繼承了IFilterMetadata接口 /// </summary> private class AddHeaderFilter : IResultFilter { public void OnResultExecuting(ResultExecutingContext context) { context.HttpContext.Response.Headers.Add( "FilterFactoryHeader", new string[] { "Filter Factory Header Value 1", "Filter Factory Header Value 2" }); } public void OnResultExecuted(ResultExecutedContext context) { } } public bool IsReusable { get { return false; } } }
在/About
中請求示例的「About
」頁面,並檢查標頭以查看結果:
未命名處理程序方法是以:Http 謂詞爲處理的程序方法,遵循如下約定:On<HTTP verb>[Async]
(追加 Async
是可選操做,但建議爲異步方法執行此操做)。主要的三個Http 謂詞:get、post、delete。
未命名處理程序方法 |
操做 |
OnGet/OnGetAsync |
初始化頁面狀態 |
OnPost/OnPostAsync |
處理 POST 請求。 |
OnDelete/OnDeleteAsync |
處理 DELETE 請求。 |
例如在index頁面,實現post提交,示例以下:
<form method="post" > <input type="submit" value="新增" class="btn btn-danger" asp-route-id="1" /> </form>
[HttpPost] public async Task<IActionResult> OnPostAsync(int id) { await SaveAsync(id); // RedirectToPageResult實現了IActionResult接口 RedirectToPageResult result = RedirectToPage(); return result; }
由開發人員提供的處理程序方法,遵循的約定是: On<HTTP verb><handler name>[Async], 處理程序名稱出如今 Http 謂詞以後或者 Http 謂詞與 Async 之間。 例如,提交一個處理程序方法名爲Message,那命名約定是OnPostMessage/OnPostMessageAsync。
<form method="post"> <input type="submit" value="消息提交" class="btn btn-danger" asp-route-id="1" asp-page-handler="Message" /> </form>
public async Task<IActionResult> OnPostMessageAsync(int id) { await SaveAsync(id); return RedirectToPage(); }
注意:OnPostMessageAsync上面不用加http謂詞。在頁面asp-page-handler必須指定後臺處理程序方法名。
上面的處理程序方法都是須要按照默認約定,才能關聯起來。使用自定義處理程序可讓用戶更改未命名和已命名的程序方法的命名方式。 假設:避免讓方法名稱以「On」開頭,並使用第一個分詞來肯定 Http 謂詞,好比將DELETE、PUT 和 PATCH 的謂詞轉換爲 POST。這樣程序能夠提供下表所示的方法名稱。
處理程序方法 |
操做 |
Get |
初始化頁面狀態 |
Post/PostAsync |
處理 POST 請求 |
PostMessage/PostMessageAsync |
POST 消息 |
DeleteMessage/DeleteMessageAsync |
OST 消息以進行刪除 |
PutMessage/PutMessageAsync |
POST 消息以進行放置 |
若要創建此方案,請從 DefaultPageApplicationModelProvider 類繼承並重寫 CreateHandlerModel 方法,以提供自定義邏輯來解析 PageModel 處理程序名稱。 示例應用展現瞭如何在其 CustomPageApplicationModelProvider 類中執行此操做:
當CustomPageApplicationModelProvider類繼承DefaultPageApplicationModelProvider想重寫處理程序方法名稱時,vs提示錯誤:DefaultPageApplicationModelProvider不可訪問,由於它具備必定保護級別。保護級別以下圖所示:
在實際項目中,通常也不會自定義處理程序方法名稱,遵循既有的方法名約定都能知足開發業務。這裏的實現之後在考慮吧。
參考文獻
官方資料:asp.net core routing