前言正則表達式
本文的目的是利用Mvc route建立一個自定義約束來控制路由跳轉實現禁止ip登錄,固然例子可能不合理,可是文章要代表的意思是當普通的路由約束不能解決咱們實際的需求時,咱們能夠經過自定義路由限制條件實現,好比當匹配路由有數據庫交互,根據url跳轉等實際需求時,使用自定義條件此問題即可迎刃而解。數據庫
實現url
舉例普通的路由約束:spa
routes.MapRoute( "Product", "Product/{productId}", new {controller="Product", action="Details"}, new {productId = @"\d+" } );
// 摘要: // 定義類必須實現才能檢查某 URL 參數值是否對約束有效的協定。 [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")] public interface IRouteConstraint { // 摘要: // 肯定 URL 參數是否包含此約束的有效值。 // // 參數: // httpContext: // 一個對象,封裝有關 HTTP 請求的信息。 // // route: // 此約束所屬的對象。 // // parameterName: // 正在檢查的參數的名稱。 // // values: // 一個包含 URL 的參數的對象。 // // routeDirection: // 一個對象,指示在處理傳入請求或生成 URL 時,是否正在執行約束檢查。 // // 返回結果: // 若是 URL 參數包含有效值,則爲 true;不然爲 false。 bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection); }
咱們只要寫一個自定義約束類來實現此接口的Math方法,它返回一個布爾值。這個布爾值決定該請求是否應該被route對象處理。code
下面咱們來定義自定義路由約束:對象
public class AbandonConstraint : IRouteConstraint { public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { var currentIp = httpContext.Request.UserHostAddress; //若是當前訪問用戶的ip是127.0.0.1,則匹配Abandon路由,若是不是則匹配其餘路由 return currentIp == "127.0.0.1"; } }
路由設置:blog
routes.MapRoute( name: "Abandon", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Abandon", id = UrlParameter.Optional }, constraints:new { customConstraint = new AbandonConstraint() }//自定義限制路由 ); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } );
配置好之後,咱們本地運行程序,便能匹配到Abandon路由,若咱們修改所要限制的ip地址,則匹配Default路由。以下圖本地運行命中abandon默認地址的action繼承
總結:接口
自定義的路由約束在實際應用中對於複雜的路由匹配條件,好比有數據庫交互,提供了便利的使用條件,同時當請求與自定義路由約束匹配時咱們還能夠動態爲其添加,修改路由參數,控制跳轉等操做,注意約束條件必須繼承IRouteConstraint,而且實現Match方法。ip
時間倉促,代碼及文章比較雜亂,有什麼出錯的地方歡迎指出。