YbSoftwareFactory 代碼生成插件【二十四】:MVC中實現動態自定義路由


   上一篇介紹了 公文流轉系統 的實現,本篇介紹下MVC下動態自定義路由的實現。

   在典型的CMS系統中,通常需要為某個欄目指定個友鏈地址,通過指定友鏈地址,該欄目的地址更人性化、方便記憶,也有利用於搜索引擎優化。

   但在MVC中,通常需要在應用程序啟動時注冊路由規則,該路由規則又通常和控制器進行了關聯,也就是某個地址通常情況下都是有對應的控制器進行處理的。但在MVC中如何做到自定義動態路由,以便能在運行時通過某個控制器處理一些運行時動態設定的Url地址呢?

   方法當然是有的:

   1、首先實現一個動態路由約束條件類:

   該類用於判斷指定的路由地址是否滿足特定的路由規則,當然該規則需要在后面進行注冊才會生效。

 1 public class CmsUrlConstraint : IRouteConstraint
 2     {
 3         public CmsUrlConstraint()
 4         {
 5             
 6         }
 7         /// <summary>
 8         /// 動態查詢數據庫,判斷當前請求地址是否滿足約定
 9         /// </summary>
10         /// <param name="httpContext"></param>
11         /// <param name="route"></param>
12         /// <param name="parameterName"></param>
13         /// <param name="values"></param>
14         /// <param name="routeDirection"></param>
15         /// <returns></returns>
16         public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values,
17             RouteDirection routeDirection)
18         {
19             if (values[parameterName] != null)
20             {
21                 //此為請求的友鏈地址參數
22                 var permalink = values[parameterName].ToString();
23 
24                 var dbcontext = new YbObjectContext("YbRapidSolution");
25                 //根據友鏈地址參數,查找欄目,存在則表示匹配成功
26                 var page = dbcontext.Set<CmsColumn>()
27                     .Where(p => p.Permalink == permalink).FirstOrDefault();
28                 if (page != null)
29                 {
30                     //匹配成功進行數據傳值
31                     HttpContext.Current.Items["cmspage"] = page;
32                     return true;
33                 }
34                 return false;
35             }
36             return false;
37         }
38     }

   2、然后注冊路由CmsColumnRoute和CmsRoute,指定上述滿足約束條件的地址該由哪個真實的控制器進行處理:

 1 public static void RegisterRoutes(RouteCollection routes)
 2         {
 3             routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 4             //routes.IgnoreRoute("{UEditor/controller}.ashx{*pathInfo}");
 5             routes.IgnoreRoute("{resource}.ashx/{*pathInfo}");
 6 
 7             routes.MapRoute(
 8             name: "CmsColumnRoute",
 9             url: "{*permalink}",
10             defaults: new { controller = "Home", action = "ColumnPage", id = UrlParameter.Optional },
11             constraints: new { permalink = new CmsUrlConstraint() }
12             );
13             routes.MapRoute(
14             name: "CmsRoute",
15             url: "{action}/{*permalink}",
16             defaults: new { controller = "Home", action = "ColumnPage", id = UrlParameter.Optional },
17             constraints: new { permalink = new CmsUrlConstraint() }
18             );
19 
20             routes.MapRoute(
21                 name: "Default",
22                 url: "{controller}/{action}/{id}",
23                 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional}
24             );
25         }

   運行原理:

   1、輸入特定地址

   2、系統通過CmsUrlConstraint類的Match方法查詢數據庫,如該地址和某個欄目中設定的友鏈地址一致,則表示匹配成功

   3、如匹配成功,則通過注冊路由時設定的Controller和Action進行后續處理並返回View。

   具體過程如下:

   實現效果如下:

   1、運行過程中可隨意指定該欄目的地址:

   2、然后通過指定的地址可訪問該頁面,但我們並沒有專門實現News的控制器:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM