ASP.NET Core 2 關於 MVC Route Attribute

關於 ASP.Net Core 2 裡面使用的路由方式有很多種,MVC 的 Route Attribute 算是我常用的方法,因為它的維護上可以和主程式分離所以比較容易。

但是,一開始的時候常常搞不懂它的運作方式,跌跌撞撞失敗了不少次才搞懂,因此特別記錄下來以便給其他需要的人看。

先講 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位置):




留言

這個網誌中的熱門文章

【研究】列印的條碼為什麼很難刷(掃描)

統一發票列印小程式

C# 使用 Process.Start 執行外部程式