本篇將介紹 ASP.NET Core 的 Routing,大致上跟 ASP.NET MVC Routing 的設定差不多,但有些小差異。
1. Startup
在 Startup 註冊路由規則,這邊設定方式跟 ASP.NET MVC 差不多。
可以註冊多個 MapRoute,每個 Request 會經過這些 RouterMiddleware 找到對應 Action。
先被執行到的路由,後面就會被跳過,所以越廣域的寫越下面。
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddMvc(); }
public void Configure(IApplicationBuilder app) { app.UseMvc(routes => { routes.MapRoute( name: "about", template: "about", defaults: new { controller = "Home", action = "About" } );
routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}" );
}); } }
|
以上設定的路由結果如下:
http://localhost:33333
會對應到 HomeController 的 Index()。http://localhost:33333/about
會對應到 HomeController 的 About()。http://localhost:33333/home/test
會對應到 HomeController 的 Test()。
2. RouteAttribute
2.1. Default Pattern
透過 RouteAttribute 綁定 Controller 的路由。
使用 RouteAttribute 後,Startup 註冊的 MapRoute 就不會對這個 Controller 產生作用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| [Route("[controller]")] public class AccountController : Controller { [Route("")] public IActionResult Profile() { return View(); }
[Route("change-password")] public IActionResult ChangePassword() { return View(); }
[Route("[action]")] public IActionResult Sample() { return View(); } }
|
以上設定的路由結果如下:
http://localhost:33333/account
會對應到 AccountController 的 Profile()。http://localhost:33333/account/change-password
會對應到 AccountController 的 ChangePassword()。http://localhost:33333/account/sample
會對應到 AccountController 的 Sample()。
若 Controller 設定了 RouteAttribute,Action 就要跟著加,不然會發生錯誤。
如果只加 Action 如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public class AccountController : Controller { public IActionResult Profile() { return View(); }
[Route("change-password")] public IActionResult ChangePassword() { return View(); }
public IActionResult Sample() { return View(); } }
|
以上設定的路由結果如下:
http://localhost:33333/account/profile
會對應到 AccountController 的 Profile()。http://localhost:33333/change-password
會對應到 AccountController 的 ChangePassword()。http://localhost:33333/account/sample
會對應到 AccountController 的 Sample()。
2.2. RESTful Pattern
若要符合 RESTful 原則路由,設定方式如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| [Route("api/[controller]")] public class ContactsController : Controller { private static List<ContactModel> _contacts;
[HttpGet] public List<ContactModel> Get() { return _contacts; }
[HttpGet("{id}")] public ContactModel Get(int id) { return _contacts.SingleOrDefault(c => c.Id == id); ; }
[HttpPost] public int Post([FromBody]ContactModel contact) { return contact.Id; }
[HttpPut("{id}")] public void Put(int id, [FromBody]ContactModel contact) { }
[HttpDelete("{id}")] public void Delete(int id) { } }
|
目前 ASP.NET Core 還沒有像 ASP.NET MVC 的 MapHttpAttributeRoutes 可以綁 Http Method 的全域路由,都要在 Action 加上 HttpMethodAttribute。
參考
Routing in ASP.NET Core