asp.net mvc 之旅—— 第三站 路由模板中強大的自定義IRouteConstraint約束

来源:http://www.cnblogs.com/huangxincheng/archive/2016/05/31/5545841.html
-Advertisement-
Play Games

我們在寫mvc的時候,經常會配置各種url模板,比如controller,action,id 組合模式,其實呢,我們還可以對這三個參數進行單獨的配置,採用的方式自然 就是MapRoute中的constraints屬性。 一:簡單的正則匹配 正則匹配算是最最簡單的一個方法,比如針對上面路由中id的值, ...


      我們在寫mvc的時候,經常會配置各種url模板,比如controller,action,id 組合模式,其實呢,我們還可以對這三個參數進行單獨的配置,採用的方式自然

就是MapRoute中的constraints屬性。

 

一:簡單的正則匹配

    正則匹配算是最最簡單的一個方法,比如針對上面路由中id的值,我可以用正則進行限定,也就是說id只能是整數,這個可以做到嗎???對這麼擴展性極強的mvc,

當然可以做到,比如我下麵寫的這樣:

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index" },
                constraints: new { id = @"\d+" }
            );

 

然後,我輸入一個正確的url,效果是這樣的。

 

當我把id改成abc的話,效果居然是這樣滴。。。。

 

牛逼吧,頁面已經無法打開,是不是很開心,接著就有弔毛找你,這個id限制能不能再強大點,根據資料庫的配置,或者第三方邏輯來顯示到底要不要顯示,

這時候是不是有點悲劇,目前的id貌似只有正則匹配,貌似並不能強大到自定義邏輯控制id值,不過不要灰心,剛纔我也說了,mvc是一個擴展性極強的框架,

這點事情自己有辦法處理。

 

二:IRouteConstraint 強大的自定義邏輯驗證

     

      可以看到IRouteConstraint 是一個介面,介面定義如下:

 1     //
 2     // 摘要:
 3     //     定義類必須實現才能檢查某 URL 參數值是否對約束有效的協定。
 4     [TypeForwardedFrom("System.Web.Routing, Version=3.5.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35")]
 5     public interface IRouteConstraint
 6     {
 7         //
 8         // 摘要:
 9         //     確定 URL 參數是否包含此約束的有效值。
10         //
11         // 參數:
12         //   httpContext:
13         //     一個對象,封裝有關 HTTP 請求的信息。
14         //
15         //   route:
16         //     此約束所屬的對象。
17         //
18         //   parameterName:
19         //     正在檢查的參數的名稱。
20         //
21         //   values:
22         //     一個包含 URL 的參數的對象。
23         //
24         //   routeDirection:
25         //     一個對象,指示在處理傳入請求或生成 URL 時,是否正在執行約束檢查。
26         //
27         // 返回結果:
28         //     如果 URL 參數包含有效值,則為 true;否則為 false。
29         bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection);
30     }

 

在這個介面中提供了一個Match方法,而我要做的就是實現一個繼承它的類就可以了,當返回true代表通過,返回false代表匹配失敗。。。。就像我現在

這樣的爛代碼:

 1     public class RouteConfig
 2     {
 3         public static void RegisterRoutes(RouteCollection routes)
 4         {
 5             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 6 
 7             routes.MapRoute(
 8                 name: "Default",
 9                 url: "{controller}/{action}/{id}",
10                 defaults: new { controller = "Home", action = "Index" },
11                 constraints: new { id = new MyRouteConstraint() }
12             );
13         }
14     }
15 
16     public class MyRouteConstraint : IRouteConstraint
17     {
18         public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
19         {
20             //獲取id的值
21             var id = values[parameterName];
22 
23             //logic。。。
24 
25             return true;
26         }
27     }

 

要看清楚哦。。。在我實現的MyRouteConstraint類中的Match方法,我通過values[parameterName]可以成功獲取id的值,不行我可以調試給親看。。。

拿到這個值之後,你就可以肆意的去玩耍了。。。

 

三:源碼分析

到現在為止,你是不是很好奇這弔毛玩意是怎麼實現的。。。。其實很簡單的哦,還記得各種mvc入門書籍中說,路由路由的概念。。。其實呢,也就是一個

Route類而已嘛。。。就像下麵這樣。

 

而Route類中,最最重要的莫過於GetRouteData方法,它就是用來決定是否可以看心情把你這個http請求送到Controller中去。。。然後我們再來看看

這個方法的源代碼。。。

 

最終,功夫不負有心人,兩串最核心的代碼展現在你的面前。

1. constraint as IRouteConstraint   如果當前是IRouteConstraint類型,走我實現的Match方法。

2. constraint as string                  走我的正則匹配,如:Regex.IsMatch。。。。

 

好了,本篇就講到這裡,希望對你有幫助。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前面學起來還是很順的,畢竟很多都接觸過。 後面學起來只能用“磨”來形容,以至於八章用了2個月。(當然也有相當一些原因是這兩個月中發生了一些個人生活上的問題) 總的來說收穫超大,這種感覺就像大一的時候學習老譚的C語言一樣,醍醐灌頂。 如果是靠.NET吃飯的人,不讀這本書真的是太可惜了。 不過這中間也出 ...
  • 上一章講了基元線程同步構造,而其它的線程同步構造都是基於這些基元線程同步構造的,並且一般都合併了用戶模式和內核模式構造,我們稱之為混合線程同步構造。 在沒有線程競爭時,混合線程提供了基於用戶模式構造所具備的性能優勢,而多個線程競爭一個構造時,混合線程通過基元內核模式的構造來提供不“自旋”的優勢。 那 ...
  • N年沒有寫博客,發個進位轉換的玩下,支持負數;功能屬於簡化版的 Convert.ToInt32 ,特點是: 1、任意位,如:0,1(二進位),0...7(八進位),0...9,A...F(16進位),0...N(N進位),或者是:!@#$%^&*(8進位,字元符號),也可以是中文。 2、8 byte ...
  • 前端工程師技能整理 一、框架與組件 bootstrap等UI框架設計與實現 伸縮佈局:grid網格佈局 基礎UI樣式:元素reset、按鈕、圖片、菜單、表單 組件UI樣式:按鈕組、字體圖標、下拉菜單、輸入框組、導航組、麵包屑、分頁、標簽、輪播、彈出框、列表、多媒體、警告 響應式佈局:佈局、結構、樣式... ...
  • 標簽:GC .Net C CLR "前言" "1. 基礎概念明晰" "1.1 公告語言運行時" "1.2 托管模塊" "1.3 對象和類型" "1.4 垃圾回收器" "2. 垃圾回收模型" "2.1 為什麼需要垃圾回收" "2.2 什麼時候進行垃圾回收" "2.3 垃圾回收時發生了什麼" "2.4 ...
  • 本文實現的需求是: A.通過web頁面啟動winform程式; B.將頁面的參數傳遞給winform程式; C.winform程式已經啟動並正在運行時,從web頁面不能重新啟動winform程式, 只是當傳入winform程式的參數更改時,winform上顯示的數據作出相應的更新。 具體實現如下: ...
  • jquery使用手冊:http://www.eduyo.com/doc/jquery/cheatsheet.html addClass 樣式: <style> .textRed { color:red; } </style> 使用: $("#th_1").addClass("textRed"); R ...
  • 這兩天做東西,業務上有個特殊的需求,在用戶訪問頁面的時候,針對某一行代碼進行控制,按照概率來進行顯示,我做的是針對當前頁面的曝光進行處理,曝光代碼是第三方的,頁面上只要有這段代碼就算是執行了這段曝光代碼,所以才寫了這個輪詢的一個方法,這個方法可以根據自己的需求修改,下麵我把這個方法全部帖出來: 這個 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...