【asp.net core 系列】4. 更高更強的路由
阿新 • • 發佈:2020-06-04
# 0. 前言
在之前我們介紹了請求通過路由尋找到控制器,以及控制器與檢視的資料流轉。那麼,我們回過頭來,再看看路由的一些其他用法。
# 1. 路由屬性(Route Attribute)
按照英文的直接翻譯,Routing Attribute 的意思是路由屬性,但實際上 Attribute在微軟的官方稱呼是特性。嗯,所以個人覺得Route Attribute應該是特性路由,路由特性。
嗯,暫且甩開稱呼的問題,小夥伴們知道這是一種使用Attribute標記的路由配置方案就行。我們之前瞭解的路由設定都是通過路由表設定的,而Route Attribute則是另外一種方案。
## 1.1 如何設定
這種方案主要是通過RouteAttribute類來設定的,我們先來看一下這個類是個什麼樣的吧:
```c#
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class RouteAttribute : Attribute, IRouteTemplateProvider
{
public RouteAttribute(string template);
public string Name { get; set; }
public int Order { get; set; }
public string Template { get; }
}
```
AttributeUsage 這個特性是用來標註特性的適用範圍的,其中`AttributeTargets.Class | AttributeTargets.Method` 表示這個特性是可以設定在類或者方法上的。AllMultiple表示是否允許設定多個,Inherited 表示被該特性標註的類其子類是否也自動繼承了這個特性。
那麼,我們瞭解了RouteAttribute的適用範圍,繼續看這個類,一共有三個屬性:
- Name 表示這個路由特性的名稱
- Order 表示啟用順序,值越小,越先被匹配。預設情況下是0
- Template 路由解析模板,也就是在《【asp.net core 系列】2 控制器與路由的恩怨情仇》中介紹的路由表的格式串
介紹了這麼多,我們先來試試看,先拿出來之前文章建立的MvcWeb專案,新建一個控制器:
```c#
using Microsoft.AspNetCore.Mvc;
namespace MvcWeb.Controllers
{
public class RouteTestController: Controller
{
public IActionResult Index()
{
return View();
}
}
}
```
建立對應檢視:
> Views > RouteTest > Index.cshtml
在Index.cshtml中隨便寫點內容,然後儲存。
然後,在RouteTestController 新增一個Route特性標記:
```c#
[Route("/Route")]
public IActionResult Index()
{
return View();
}
```
啟動專案,訪問 `http://localhost:5006/Route` 後,如果不出意外可以看到跟下圖類似的介面:
![image-20200603002255361](https://img2020.cnblogs.com/other/1266612/202006/1266612-20200604160607099-78546388.png)
那麼我們試一試通過路由表設定的路徑是否可以訪問:
```
http://localhost:5006/RouteTest
```
![image-20200603003824041](https://img2020.cnblogs.com/other/1266612/202006/1266612-20200604160607316-1045222256.png)
可以看到提示404,也就是說這個Action無法通過路由表的形式查詢到了。
## 1.2 設定引數
我們知道所謂的Action其實也是一個方法,而我們通常請求一個網址的時候,網址中也帶有一些查詢引數。所以,這一節我們就介紹一下路由特性(屬性路由)如何設定引數的解析吧。
### 1.2.1 不做任何操作
在RouteTestController裡新增方法:
```c#
[Route("/route/norest")]
public IActionResult NoRest(string name)
{
ViewBag.Name = name;
return View();
}
```
建立對應的View:
```html