如何在 ASP.NET Core MVC 5 中处理未知的 Action
ASP.NET Core MVC 5 是一個輕量級,開源的,利于單元測試的基于 ASP.NET Core 運行時的 web 框架,在開發時你肯定會遇到不少那些 request 無法匹配 Action 的情況,通常做法是拋出 404,但有些場景下我希望能收口到統一一個 Action 去執行,這篇文章我們將會討論如何去處理那些未知 Action 的收口。
創建 Controller
現在我們創建一個 AuthorController 類,如下代碼所示:
public?class?AuthorController?:?Controller{[HttpGet]public?ActionResult?Index(){return?View();}}未知 Action 的問題
先拋出問題,然后再來看一下怎么解決,假設現在在做一個 圖書搜索系統,你希望用戶可以根據 作者名,書名,文章標題 等條件去查詢圖書信息,首先你需要知道目錄所包含的所有作者,書籍,文章的詳細信息,那么這個需求怎么實現呢?
為了實現需求,我肯定會先在 Views 文件夾下新增對應的 view 文件,比如 Authors.cshtml, Books.cshtml, Articles.cshtml,方便用戶查詢時導向各自的 view ,比如下面的請求。
/Author/Books? /Author/Articles顯而易見下面的 url 它可以非常利索的導向 AuthorController 下的 Index 方法。
/Author/Index回過頭來,如果你在瀏覽器中輸入如下兩個url,這時候肯定會拋異常,很顯然 AuthorControler 下并沒有所謂的 Books 和 Articles 這兩個 Action 方法。
/Author/Books /Author/Articles使用 routing 處理未知 Action
那如何對這些未知 Action 進行收口呢?可以使用 Routing 機制來解決此類問題,如下代碼所示:
public?void?Configure(IApplicationBuilder?app,?IWebHostEnvironment?env){app.UseStaticFiles();app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints?=>{endpoints.MapControllerRoute(name:?"viewName",pattern:?"{controller}/{*viewName}",defaults:?new?{?action?=?"DisplayAnyView"?});});}上面代碼的意思是,使用視圖名 (*viewName) 來匹配 Action,如果能找到對應的 Action 則可以進行渲染,如何找不到就默認跳到 DisplayAnyView 這個Action上,下面是 DisplayAnyView 方法的實現。
public?IActionResult?DisplayAnyView(string?viewName) {return?View(viewName); }完整的 AuthorController 代碼如下:
public?class?AuthorController?:?Controller{[HttpGet]public?ActionResult?Index(){return?View();}public?IActionResult?DisplayAnyView(string?viewName){return?View(viewName);}}接下來把程序跑起來后,輸入:http://localhost:32172/Author/Books ?, 你會觀察到 DisplayAnyView 方法中的斷點被成功命中,如下圖所示:
Action 是 Controller 下的 public & non-static 方法,它可以有效的將 request 請求匹配到對應的 action 上,然而當 request 所匹配的 action 不存在時將會拋出運行時異常,現在你可以避免這種情況了。
譯文鏈接:https://www.infoworld.com/article/3600794/how-to-handle-unknown-actions-in-aspnet-core-mvc-5.html
總結
以上是生活随笔為你收集整理的如何在 ASP.NET Core MVC 5 中处理未知的 Action的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 生态合作与自主可控
- 下一篇: Mock 框架 Moq 的使用