1. 程式人生 > 其它 ><一>Asp.netcore MVC 路由及URL生成

<一>Asp.netcore MVC 路由及URL生成

一、MVC介紹

MVC是使用模型-檢視-控制器(Model-View-Controller)設計模式構建網頁應用與API的豐富框架。使用者請求被路由到控制器,控制器負責與模型( Model)協作,以執行使用者操作和/或返回請求結果顯示給使用者,這種模式有助於實現關注分離。
模型-檢視-控制器(MVC)架構模式將一個應用分為三部分。

  • 模型(Model):MVC應用中的模型代表了應用的狀態和業務邏輯或其可以展現的一些操作。業務邏輯應該封裝在模型中,連同應用持久化狀態實現邏輯。強型別檢視一般使用特別設計的檢視模型( ViewModel)型別,它包含了檢視顯示所需要的資料;控制器將建立並根據模型填充這些檢視模型。
  • 檢視(View):負責在使用者介面呈現內容。它們使用Razor檢視引擎在HTML標記中嵌入.NET程式碼。檢視中應僅包含少量的邏輯,並且這些邏輯應該與呈現內容相關。
  • 控制器(Controller):控制器是承載使用者互動、模型運轉,並最終選擇檢視進行渲染的元件。在MVC應用中,檢視只顯示資訊,控制器則處理檢視並對使用者輸入和互動做出響應。在MVC模式中,控制器是最初的入口,負責選擇同哪一個模型型別協作,以及選擇哪一個檢視來呈現。它不應該有太多職責。為避免控制器邏輯過於複雜,請使用單一職責原則將業務邏輯從控制器移到領域模型。

二、ASP.NET Core MVC 路由

ASP.NET Core MVC框架是一個配合使用ASP.NET Core優化的輕量級、開源、高度可測試的表現框架。它提供了一種基於MVC模式的方法來構建動態網站。

1、 路由: 一項強大的 URL 對映元件,使得我們可以定義應用程式的 URL 命名形式, 使得它在搜尋引擎優化 (SEO) 和連結生成中執行良好, 而不用關心 Web 伺服器上的檔案到底是如何組織的。當接 收到一個請求時, 路由引擎解析 URL 並將其匹配至一個定義 URL 格式, 然後呼叫相關的控制器的操作方法。

routes. MapRoute ("default", " { controller=Home} / { action=Index) / {id?}") ; 路由模板:
{controller = Home) 將Home 定義為預設控制器。
{action = Index}將 Index定義為預設操作
{id
?}將id定義為可選。 預設路徑引數和可選路徑引數不需要出現在匹配的URL路徑中。
  • 多路由:可以在 UseMvc 裡面通過新增 MapRoute 來新增多個路由。這樣做可以定義多個約定,或新增專用於特定操作的常規路由。路由集合中的路由是有序的,並且會按照它們被新增的順序進行處理。
app.UseMvc(routes =>{
    routes. MapRoute ("blog", "blog/ {*article}", 這裡的 blog 路由是專用常規路由,這意味著它不採用常規路由系統,而是專用千一個特定的動作。這個路由始終指向 BlogController.Article。
    defaults: new { controller = "Blog", action = "Article" }) ;             
    routes. MapRoute ("default", " { controller=Home} / {  action=Index} / {id?}") ;
}    
  • 特性路由:特性路由使用一組特性直接將操作對映到路由模板。HomeController.Index操作將對/、/Home或者/Home/Index中任一URL路徑訪問執行。
[Route("")] 
[Route ("Home") 
[Route ("Home/Index")
public IActionResult Index()
{ 
    return View(); 
}

特性路由也可以使用 HTTP[Verb]特性.對於/products 這個 URL 路徑來說,ProductsApi.ListProducts 操作會在 HTTP 動詞是 GET 時執行

[HttpGet("/products")]
public IActionResult ListProducts() { 
}
  • 組合路由:為了減少特性路由的重複部分,控制器上的路由特性會和各個操作上的路由特性進行結合。
[Route("products") ] 
public class ProductsApiController : Controller
{
     [HttpGet] 
     public IActionResult GetProducts () { ... }  
}
  •  路由模板中的標記替換([controller]、 [action]、 [area])
[ Route (" [controller]/ [action]") 
public class ProductsController : Controller
 [HttpGet("[controller]/ [action]")] //匹配 '/Products/List' 
public IActionResult List () {
[HttpPost("Buy")] //匹配'Products/Buy' 和'Store/Buy'
[HttpPost ("Checkout")] //匹配'Products/Checkout' 和'S七ore/Checkout' public 工ActionResul七 Buy()
  • IRouteTemplateProvider 自定義路由特性,當特性被啟用時,自動使用template設定的特性
public class MyApiControllerAttribute : Attribute, IRouteTernplateProvider
{
public string Template => "api/[controller]";
public int? Order { get; set; } public string Name { get; set; } }

三、生成Url 

MVC應用程式可以使用路由URL的生成特性來生成URL連結到操作。 生成URL可消除硬編碼URL, 會使你的程式碼更健壯和易維護。IUr!Helper介面是MVC與生成URL路由之間基
礎設施的基本塊。可以通過控制器、檢視以及檢視元件中的Uri屬性找到 個可用的IUrlhelper。

  • 通過操作名生成URL  Uri.Action (IUrlHelper、 Action) 以及所有相關的過載都是基於通過指定控制器名和操作名來指定要連結的內容。
public IActionResult Index()
{
     var url = Url.Action ("Destination");
     return Content($"Go check out {url}");
} 
  • 通過路由生成URL
public IActionResult Index()
{
     var url = Url.RouteUrl("Destination");
     return Content($"Go check out {url}");
} 
  • 在操作結果中生成URL:ControllerBase和Controller基類為引用其他操作的操作結果提供了簡便方法。用法是接受使用者輸入後進行重定向。
return RedirectToAction("Index");

四、區域(Areas)

是一種 MVC功能, 用來將相關功能組織為一個組,使用區域允許應用程式擁有多個相同名稱的控制器,只要它們具有不同的區域。

app.UseMvc(routes =>
{
routes.MapAreaRoute ("blog_route", "Blog", 
"Manage/{controller}/{action}/{id?}"); 
routes.MapRou七e("default_route", "{controller)/{action}/{id?}");
})

當匹配 URL 路徑(如/Manage/Users/AddU ser) 時, 第一個路由會產生路由值{ area = Blog, controller = Users, action = AddUser }。 area 路由值是通過 area的預設值產生的;

也可以通過區域特性areaAttribute 限定控制器屬於哪個區域。

[Area ("Blog")] 
public class UsersCon七roller : Con七roller
{ 
}