3.自定義路由約束瀏覽器
什麼叫自定義路由約束呢?假如路由格式爲archive/{year}/{month}/{day},其中year,month,day是有約束條件的,必須是數字,並且有必定範圍。url
這時候,咱們就能夠設置約束類,進行自定義路由約束了。spa
第一步: 咱們先添加年份限制類 YearRouteConstraint。請看代碼:code
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Routing; using System.Globalization; namespace MvcMobileDMS.App_Start { public class YearRouteConstraint:IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { if (routeDirection == RouteDirection.IncomingRequest && parameterName.ToLower(CultureInfo.InvariantCulture) == "year") { try { int year = Convert.ToInt32(values["year"]); if ((year >= 1900) && (year <= 2100)) return true; } catch { return false; } } return false; } } }
第二步:添加月份限制類 MonthRouteConstraint。請看代碼:blog
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Routing; using System.Globalization; namespace MvcMobileDMS.App_Start { public class MonthRouteConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { if (routeDirection == RouteDirection.IncomingRequest && parameterName.ToLower(CultureInfo.InvariantCulture) == "month") { try { int month = Convert.ToInt32(values["month"]); if ((month >= 1) && (month <= 12)) return true; } catch { return false; } } return false; } } }
第三步:添加日期限制類DayRouteConstraint。請看代碼:路由
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Routing; using System.Globalization; namespace MvcMobileDMS.App_Start { public class DayRouteConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { if (routeDirection == RouteDirection.IncomingRequest && parameterName.ToLower(CultureInfo.InvariantCulture) == "day") { try { int month = Convert.ToInt32(values["month"]); int day = Convert.ToInt32(values["day"]); if (day < 1) return false; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: if (day <= 31) return true; break; case 2: if (day <= 28) return true; break; case 4: case 6: case 9: case 11: if (day <= 30) return true; break; } } catch { return false; } } return false; } } }
ok,三個限制類已經寫完了,須要在全局應用程序類中配置路由,見代碼清單:string
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; using System.Web.Routing; namespace MvcMobileDMS { public class RouteConfig { public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "DMS", action = "logon", id = UrlParameter.Optional } ); routes.MapRoute( "Archive", "archive/{year}/{month}/{day}", new { controller = "Archive", action = "Index", year = "", month = "", day = "" }, new { year = new MvcMobileDMS.App_Start.YearRouteConstraint(), month = new MvcMobileDMS.App_Start.MonthRouteConstraint(), day =new MvcMobileDMS.App_Start.DayRouteConstraint() } ); } } }
咱們看看運行結果:it
當我在瀏覽器地址欄輸入如下地址時,http://localhost:7449/archive/1988/9/10,以下截圖:io
而當我輸入不知足約束條件的地址時,http://localhost:7449/archive/1988/09/34,以下截圖:class
因而可知,當輸入非法路由時,路由系統會當作錯誤處理,因此咱們能夠爲MVC路由設置約束,以規範路由格式。
好了,今天寫到這裏。但願能對你有所幫助O(∩_∩)O哈哈~