星期五, 6月 04, 2010

用 IRouteConstraint 來約束 Route

我們在學MVC的時候,第一部份應該是接觸 Global.asax 這檔案,因為這關係到我們的網址的格式,輸入網址會到哪一個 Controller 哪一個 action 去做哪些事情,所以好好認識 Route 的設定方式是非常重要的,我們今天來練習一下 Route Constraint,這可以來限制網址會不會吃到這一筆 Route,直接開始吧!!

有個需求,需要新增一筆 Route ,他只吃"時間"的參數,格式如下
http://localhost/20101010
http://localhost/20100523


首先我們先寫一個 DateFormatRouteConstraint,這個 Class 要實作 IRouteConstraint

/// <summary>
/// 日期格式驗證
/// </summary>
public class DateFormatConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route,
string parameterName, RouteValueDictionary values,
RouteDirection routeDirection)
{
string pName = parameterName.ToLower();
if (routeDirection == RouteDirection.IncomingRequest
&& pName == "date")
{
try
{
string v = values[pName].ToString();
//如果參數不等於8就不屬於日期格式
if (v.Length != 8)
return false;
//驗證是否為日期
int year = int.Parse(v.Substring(0, 4));
int MM = int.Parse(v.Substring(4, 2));
int dd = int.Parse(v.Substring(6, 2));
DateTime datetime = new DateTime(year, MM, dd);
return true;
}
catch
{
return false;
}
}
return false;
}
}

我們就可以在 Global.asax 裡面新增一筆 Route 啦

//多加一條有關時間的route
routes.MapRoute(
"DateTimeRule",
"{datetime}",
new { controller = "file", action = "index", date = "" },
new { date = new Models.DateFormatConstraint() }
);

這樣就可以達到我們的需求了,收工!!

參考
http://msdn.microsoft.com/zh-tw/library/system.web.routing.irouteconstraint%28VS.90%29.aspx

沒有留言: