ASP.NET Core 2 關於 MVC Route Attribute
關於 ASP.Net Core 2 裡面使用的路由方式有很多種,MVC 的 Route Attribute 算是我常用的方法,因為它的維護上可以和主程式分離所以比較容易。
但是,一開始的時候常常搞不懂它的運作方式,跌跌撞撞失敗了不少次才搞懂,因此特別記錄下來以便給其他需要的人看。
先講 MVC 裡面對於 URL 的拆解方式,假如看到下面的 URL:
用企業的描述法來說就是到 localhost:500 的服務器上,
(Controller)取得人資系統(HR/Human Resources)資訊裡,
(Action)以ID方式取得員工資料(Employee_GetByID),
(Arguments)員工編號為 k004521
這樣好處是容易理解這個 Request 的目的。
當然回傳的內容依照自己系統需求而訂,可以是純字串、XML字串或是JSON字串都可以。
那麼,在ASP.NET Core 2 如何實現呢?
首先,準備一個類別檔案 ApiControllers.cs,這檔案我習慣放在 Controllers 資料夾下面(分類整理比較方便),當然懶得這樣分類也是可以放在與 Startup.cs 同一層下
※這個檔案沒有完全遵照C#編輯器產生的檔案與類別同名,因為我把這個檔案當成是一個Collections。
這個類別檔(ApiControllers.cs)裡面有定義兩個 Class 分別是 ApiAboutController 和 HRController。
由於這個類別使用 MVC 路由宣告,所以要引用:
請注意到這個 Class 前面有宣告 [Route("NameOfController")] 這樣的東西,這個 NameOfController 就是執行時 URL 上的 Controller 名稱。
接下來每個 Class 裡面都會定義 Method 方法,而在 Method 前面宣告 [Route("NameOfAction")] ,而這個 NameOfAction 則是URL 裡面的 Action 名稱。
接下來,如果讓這樣的路由宣告生效,就要在 Startup.cs 使用 MVC 方法,請看:
首先要把 ApiControllers 引用進來,因為 ApiControllers.cs 的 namespace 放在 SimplyApi.Controllers ,所以要引用:
再來要在 ConfigureServices 加入 MVC 服務
然後在 Configure 裡面建立 Controller 的 Mapping
這個範例以兩種方式去實做 Mapping ,一種是以 new 方式建立實例來運作,另一種則以 template 方式運行。它們的結果是一樣的。
執行結果如下(注意URL位置):
但是,一開始的時候常常搞不懂它的運作方式,跌跌撞撞失敗了不少次才搞懂,因此特別記錄下來以便給其他需要的人看。
先講 MVC 裡面對於 URL 的拆解方式,假如看到下面的 URL:
http://localhost:5000/hr/Employee_GetByID?=k004521它的組成就是像下面階層一樣:
用企業的描述法來說就是到 localhost:500 的服務器上,
(Controller)取得人資系統(HR/Human Resources)資訊裡,
(Action)以ID方式取得員工資料(Employee_GetByID),
(Arguments)員工編號為 k004521
這樣好處是容易理解這個 Request 的目的。
當然回傳的內容依照自己系統需求而訂,可以是純字串、XML字串或是JSON字串都可以。
那麼,在ASP.NET Core 2 如何實現呢?
首先,準備一個類別檔案 ApiControllers.cs,這檔案我習慣放在 Controllers 資料夾下面(分類整理比較方便),當然懶得這樣分類也是可以放在與 Startup.cs 同一層下
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SimplyApi.Controllers
{
[Route("about")]
public class ApiAboutController {
[Route ("")]
public string home() {
return "Resource Support API";
}
[Route("country")]
public string Country() {
return "Taiwan";
}
}
[Route("hr")]
public class HRController{
[Route("")]
public string home(){
return "no choose action!";
}
[Route("Station_GetById")]
public string Station_GetById(string args){
return $"station = {args}";
}
[Route("Employee_GetById")]
public string Employee_GetById(string args){
return $"Employee info = {args}";
}
}
}
※這個檔案沒有完全遵照C#編輯器產生的檔案與類別同名,因為我把這個檔案當成是一個Collections。
這個類別檔(ApiControllers.cs)裡面有定義兩個 Class 分別是 ApiAboutController 和 HRController。
由於這個類別使用 MVC 路由宣告,所以要引用:
using Microsoft.AspNetCore.Mvc;
請注意到這個 Class 前面有宣告 [Route("NameOfController")] 這樣的東西,這個 NameOfController 就是執行時 URL 上的 Controller 名稱。
接下來每個 Class 裡面都會定義 Method 方法,而在 Method 前面宣告 [Route("NameOfAction")] ,而這個 NameOfAction 則是URL 裡面的 Action 名稱。
接下來,如果讓這樣的路由宣告生效,就要在 Startup.cs 使用 MVC 方法,請看:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using SimplyApi.Controllers;
namespace SimplyApi
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
// 挹注MVC服務
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
//宣告 MVC Route Attribute Mapping
app.UseMvc(routers =>{
//以建立 Controller 實體處理 Route
routers.MapRoute(
name:"about",
template:"about",
defaults: new ApiAboutController{}
);
//以 Route Attribute 名稱樣版處理
routers.MapRoute(
name:"default",
template:"{Controller = hr}/{Action = Index}/{id?}"
);
});
// 最終處理 app.Run
app.Run(async (context) =>
{
await context.Response.WriteAsync("This is Startup Return infomation");
});
}
}
}
首先要把 ApiControllers 引用進來,因為 ApiControllers.cs 的 namespace 放在 SimplyApi.Controllers ,所以要引用:
using SimplyApi.Controllers;
再來要在 ConfigureServices 加入 MVC 服務
services.AddMvc();
然後在 Configure 裡面建立 Controller 的 Mapping
//宣告 MVC Route Attribute Mapping
app.UseMvc(routers =>{
//以建立 Controller 實體處理 Route
routers.MapRoute(
name:"about",
template:"about",
defaults: new ApiAboutController{}
);
//以 Route Attribute 名稱樣版處理
routers.MapRoute(
name:"default",
template:"{Controller = hr}/{Action = Index}/{id?}"
);
});
這個範例以兩種方式去實做 Mapping ,一種是以 new 方式建立實例來運作,另一種則以 template 方式運行。它們的結果是一樣的。
執行結果如下(注意URL位置):
留言