摘要: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定義更加嚴謹。
*參考網址
(2) http://stephenwalther.com/archive/2008/08/07/asp-net-mvc-tip-30-create-custom-route-constraints