ASP.NET MVC Routing

  • 1626
  • 0
  • 2013-11-07

摘要:ASP.NET MVC Routing

前言

        在.NET MVC裡,Routing觀念佔有十分重要的角色,不僅可以自訂URL規則,使其更有意義也容易理解,此種機制叫做URL Rewriting。本篇就針對此觀念進行說明,以及為URL加入約束條件(constraints)進行實作說明。

 

Route 

在.Net MVC所有網頁的傳遞,都會依據我們所定義的Route Table規則來顯示,好比說我們可能會建立10個MapRoute,而每次的接收到Request時,比對方式是由上到下,如果沒有比對到符合規則的網址,就會顯示404錯誤,預設的MapRoute如下:

 

 

   public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Logon", action = "Index", id = UrlParameter.Optional }           
            );
        }

在指定Route時,有幾個需注意的地方:

(1) name屬性可以任意指定

(2) url 的部份,有大括弧{ },表示變數,由上面的route table為例,以下為合理URL:

/

/Logon/Index/123

/Logon/Index/abc

但是如果我們要限制其id變數只能出現數字的話,此時,就需要增加 constraints的約束條件的屬性,

constraints: new { id = new IntConstraint() }

其回傳結果需為bool,true的話表示符合條件,false則不符合。

而需另外撰寫class並繼承IRouteConstraint,並實作

bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection);

如以下範例所示:

 

public class IntConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
                        RouteDirection routeDirection)
    {
        if (values.ContainsKey(parameterName))
        {
            var guid = values[parameterName] as Int32?;
            if (guid.HasValue == false)
            {
                var stringValue = values[parameterName] as string;
                if (string.IsNullOrWhiteSpace(stringValue) == false)
                {
                    int parsedInt;
                    int.TryParse(stringValue, out parsedInt);
                    guid = parsedInt;
                }
            }
            return (guid.HasValue && guid.Value != 0);
        }
        return false;
    }
}

結論

透過以上做法來限制參數條件,讓URL定義更加嚴謹。

 

*參考網址

(1) http://demo.tc/Post/786

(2) http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints