ASP.NET Core MVC 的 Routing 設定

在學習 ASP.NET Core MVC (之後簡稱 ASP.NET MVC) 的時候,我覺得 Routing 的觀念在最一開始一定要先弄懂,因為它跟網址後面的參數設定有關,且因為功能強大,所以我覺得在最一開始很難掌握它,故本篇文章將會針對這部份做解說。

本文大致上會有下列項目

  • default route
  • defaults 參數
  • constrains 參數
  • 設定 http method
  • 利用 attribute 設定

default route

在新增 ASP.NET MVC 專案後,開啟底下的 Startup.cs 檔,會看到下列程式碼:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

這個是預設的 routing 設定,template 上的值就是網站上 url 的設定,值要依序是 Controller 的名稱及 Action 名稱,最後的 id 因為結尾加了問號,所以可為空。另外 {controller=Home} 的意思就是網址後面沒輸入 Controller 名稱的話,預設會呼叫 HomeController 這個類別(繼承自 Controller 類別),{action=Index} 則是預設會呼叫 Controller 底下的 Index method。

defaults 參數

另外,也可以用另一種方式來表達預設值,就是利用"defaults"參數,例如下列程式碼:

routes.MapRoute(
    name: "default",
    template: "{controller}/{action}/{id?}",
    defaults: new { controller = "Home", action = "Index" });

當然,也有可能對外的 API 名字跟實際上的 Controller 還有 Action 差異很大,像是下列這樣:

routes.MapRoute(
    name: "API_Route",
    template: "Test/API1",
    defaults: new
    {
        controller = "Home",
        action = "TestAPI1"
    });

雖然這樣設定程式是可以動,但就欠缺了彈性。

constrains 參數

constrains 參數可以用來限制網址帶進來的參數,例如以下程式碼:

routes.MapRoute(
    name: "default2",
    template: "API/HomeAPI/{action}/{id}",
    defaults: new { controller = "Home", action = "Index" },
    constraints: new { id = @"\d+" });

從上面可以很清楚的看到 id 上有設定 regular expression,就是只允許數字。不過,這樣的方式有一個缺點,就是如果輸入一個很大的數,一般的整數型態有可能會裝不下,所以還有另一種檢查方式,就是實作 IRouteConstraint 這個 attribute 類別,程式碼如下:

public class IntConstraint : IRouteConstraint
{
    public IntConstraint()
    {
    }

    public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
    {
        return int.TryParse(values[routeKey].ToString(), out int val);
    }
}

程式碼很簡單,只要確定帶進來的值是否可以成功轉換為整數即可,而實作後,使用方法如下:

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default2",
        template: "API/HomeAPI/{action}/{id}",
        defaults: new { controller = "Home", action = "Index" },
        constraints: new { id = new IntConstraint() });
});

設定 http method

如果要限制 Controller 底下 Action 的 http method,可以利用 HttpGet 以及 HttpPost 這兩個 Attribute,像是這樣:

[HttpGet]
public IActionResult TestGet()
{
    return View();
}

[HttpPost]
public IActionResult TestPost()
{
    return View();
}

利用 attribute 設定

除了前述在 Startup.cs 底下設定 routing,其實也可以在 Controller 中設定:

public class AttributeTestController : Controller
{
    [Route("AttrTest/Index2")]
    public IActionResult Index2()
    {
        var result = new { name = "Index2" };
        JsonResult jsonResult = new JsonResult(result);

        return jsonResult;
    }
}

網站啟動後,就可以使用 http://localhost/AttrTest/Index2 這樣的網址。

參考資料

廣告

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

w

連結到 %s