成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺析ASP.NET MVC路由規則XML化的方法

開發 后端
本文由作者為大家介紹ASP.NET MVC路由規則XML化的方法,希望對大家的開發有所幫助。

本文主要針對的是ASP.NET MVC路由規則的問題,作者本次所研究的是ASP.NET MVC路由規則XML,希望那個通過本文能對大家有所幫助。

最近由于工作關系,重新回顧了ASP.NET MVC的1.0 版本。2.0版本還沒有研究。

由于MVC框架發展不久,還有很多不足的地方。其中關于路由規則配置這一塊問題比較大。首先路由規則是在全局配置問價 Global.asax 的 Application_Start()事件中注冊的。

  1. public static void RegisterRoutes(RouteCollection routes)    
  2.    {    
  3.        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");    
  4.         routes.MapRoute(    
  5.    "User",                                              // Route name    
  6.    "{controller}/{action}/{id}",                        // URL with parameters    
  7.  new { controller = "User", action = "Show", id = "0" } // Parameter defaults    
  8.         );    
  9.     }    
  10.     protected void Application_Start()    
  11.     {    
  12.         RegisterRoutes(RouteTable.Routes);    
  13.     }  

默認硬編碼的方式使得以后可維護程度大大降低。MVC 1.0 似乎沒有提供很好的基于配置文件的路由規則設置。所以只好自己實現了。直到寫這篇文章時,才找到了一個比較好的解決方案。

以下是 自定義的XML 格式

  1. <?xml version="1.0" encoding="utf-8" ?>    
  2. <MapRoutes>  
  1. <!--默認規則-->    
  2. <MapRoute name="Default" url="{controller}/{action}">    
  3.   <Params>    
  4.     <Item key="controller" default="Article"/>    
  5.     <Item key="action" default="Index"/>    
  6.   </Params>    
  7. </MapRoute>    
  8.  <!--顯示新聞列表的路由規則-->    
  9. <MapRoute name="ShowArticleList" url="{controller}/{action}/{typeId}/{pageIndex}/{pageSize}">    
  10.   <Params>    
  11.     <Item key="controller" default="Article"/>    
  12.     <Item key="action" default="Index"/>    
  13.     <Item key="typeId" default="1"/>    
  14.     <Item key="pageIndex" default="1"/>    
  15.     <Item key="pageSize" default="10"/>    
  16.   </Params>    
  17. </MapRoute>    
  18.  </MapRoutes>  

一下是全部代碼

  1.  /* ***********************************************    
  2.   * 作者 :湯曉華/tension 任何轉載請務必保留此頭部信息 版權所有 盜版必究    
  3.  * Email:tension1990@hotmail.com     
  4.  * 描述 :    
  5.  * 創建時間:2010-3-9 15:17:26    
  6.  * 修改歷史:    
  7.  * ***********************************************/   
  8.  using System;    
  9.  using System.Collections.Generic;    
  10.  using System.Linq;    
  11.  using System.Text;    
  12.  using System.Web.Routing;    
  13.  using System.Web.Mvc;    
  14.  using System.Xml.Linq;    
  15.  using Microsoft.CSharp;    
  16.  using System.CodeDom.Compiler;    
  17.  namespace Tension.Mvc    
  18.  {    
  19.      public static class RouteHelper    
  20.      {    
  21.          /// <summary>    
  22.          /// 從XML文件中注冊路由規則    
  23.          /// </summary>    
  24.          /// <param name="routes"></param>    
  25.          /// <param name="cfgFile"></param>    
  26.          public static void Register(this RouteCollection routes, string cfgFile)    
  27.          {    
  28.              IList<Route> Routes = GetRoutes(cfgFile);     
  29.              foreach (var item in Routes)    
  30.             {    
  31.                  //路由規則對象    
  32.                  object obj = CreateObjectFormString(item.ToString(), item.Name);    
  33.                  routes.MapRoute(    
  34.                         item.Name,               // Route name    
  35.                         item.Url,                // URL with parameters    
  36.                         obj                     // Parameter defaults    
  37.                     );     
  38.              }    
  39.          }    
  40.          /// <summary>    
  41.          ///  從XML文件中注冊路由規則 默認文件為網站根目錄下MapRoute.config    
  42.          /// </summary>    
  43.          /// <param name="routes"></param>    
  44.          public static void Register(this RouteCollection routes)    
  45.         {    
  46. Register(routes, string.Format("{0}\\MapRoute.config", Tension.ServerInfo.GetRootPath()));    
  47.         }      
  48.          /// <summary>    
  49.         /// 從string動態創建類對象    
  50.         /// </summary>    
  51.          /// <param name="codeString"></param>    
  52.          /// <param name="className"></param>    
  53.         /// <returns></returns>    
  54.          private static object CreateObjectFormString(string codeString, string className)    
  55.          {    
  56.              CSharpCodeProvider ccp = new CSharpCodeProvider();    
  57.              CompilerParameters param = new CompilerParameters(new string[] { "System.dll" });    
  58.              CompilerResults cr = ccp.CompileAssemblyFromSource(param, codeString);    
  59.              Type type = cr.CompiledAssembly.GetType(className);    
  60.              return type.GetConstructor(System.Type.EmptyTypes).Invoke(null);    
  61.          }    
  62.  /// <summary>    
  63. /// 從XML文件中解析路由規則    
  64. /// </summary>    
  65.  /// <param name="configFile"></param>    
  66. /// <returns></returns>    
  67. private static IList<Route> GetRoutes(string configFile)    
  68. {    
  69. StringBuilder sb = new StringBuilder();    
  70. Console.WriteLine(sb.ToString());    
  71. IList<Route> Routes = new List<Route>();    
  72. XElement xe = XElement.Load(configFile);    
  73. #region MyRegion    
  74. foreach (var item in xe.Elements("MapRoute"))    
  75.  {    
  76. 名稱屬性    
  77. XAttribute xaName = item.Attribute("name");    
  78. if (xaName == null || string.IsNullOrEmpty(xaName.Value))    
  79. {    
  80. throw new ArgumentNullException("name!說明:路由配置文件中某規則缺少name屬性或name屬性的值為空字符串");    
  81.  }    
  82. //URL屬性    
  83. XAttribute urlName = item.Attribute("url");    
  84.  if (urlName == null || string.IsNullOrEmpty(urlName.Value))    
  85. {    
  86.  throw new ArgumentNullException("url!說明:路由配置文件中某規則缺少url屬性或url屬性的值為空字符串");    
  87.   }    
  88. Dictionary<stringstring> DictParams = new Dictionary<stringstring>();    
  89.  #region MyRegion    
  90.  foreach (var pItem in item.Element("Params").Elements("Item"))    
  91.   {    
  92.  XAttribute itemKey = pItem.Attribute("key");    
  93. if (itemKey == null || string.IsNullOrEmpty(itemKey.Value))    
  94.  {    
  95. throw new ArgumentNullException("Item->key!說明:路由配置文件中某規則缺少Item->key屬性或Item->key屬性的值為空字符串");    
  96.   }    
  97.  XAttribute itemDefault = pItem.Attribute("default");    
  98. if (itemDefault == null || string.IsNullOrEmpty(itemDefault.Value))    
  99. {    
  100. throw new ArgumentNullException("Item->default!說明:路由配置文件中某規則缺少Item->default屬性或Item->default屬性的值為空字符串");    
  101.  }    
  102.  DictParams.Add(itemKey.Value, itemDefault.Value);    
  103.  }    
  104.  #endregion    
  105. Routes.Add(new Route() { Name = xaName.Value, Url = urlName.Value, Params = DictParams });    
  106. }    
  107.  #endregion    
  108.  return Routes;    
  109.     }    
  110.     }    
  111.  /// <summary>    
  112.  /// 路由規則    
  113.  /// </summary>    
  114.  public class Route    
  115.  {    
  116.  public string Name { getset; }    
  117. public string Url { getset; }    
  118. public Dictionary<stringstring> Params { getset; }    
  119.  /// <summary>    
  120. /// 重寫ToString 方法 產生需要動態代碼段    
  121. /// </summary>     
  122.  /// <returns></returns>    
  123.  public override string ToString()    
  124.  {    
  125.  StringBuilder sb = new StringBuilder();    
  126.  sb.AppendFormat("public class {0}", Name);    
  127. sb.Append("{");    
  128.  foreach (var item in Params)    
  129.  {    
  130. sb.AppendFormat("public string {0}", item.Key);    
  131. sb.Append("{get{return \"");    
  132. sb.Append(item.Value);    
  133. sb.Append("\";}} ");    
  134.   }    
  135. sb.Append("}");    
  136.  return sb.ToString();    
  137.  }    
  138.    }    
  139. }  

在實現過程中遇到的最大問題就是 參數列表的動態裝載 看一下以下代碼

  1. routes.MapRoute(   
  2. "User",                                              // Route name   
  3.  "{controller}/{action}/{id}",                           // URL with parameters   
  4. new { controller = "User", action = "Show", id = "0" }  // Parameter defaults   
  5.  );  

這是硬編碼實現的路由規則注冊

其中 第三個參數(new { controller = "User", action = "Show", id = "0" } ) 是一個匿名對象

該對象如何動態構建成了難題。(才疏學淺)

嘗試著傳入一個 Dictionary<K,T> 但是沒有用,ASP.NET 解析這個參數的時候是以反射形式讀取的對象屬性。

后來想到了使用代碼段 在運行時動態創建對象。

我們將類似代碼段

  1. public class Default{public string controller{get{return "Article";}} public str   
  2. ing action{get{return "Index";}} public string id{get{return "0";}} public strin   
  3. g page{get{return "1";}} public string size{get{return "10";}} } 

傳入方法

  1. private static object CreateObjectFormString(string codeString, string className)   
  2. {   
  3. CSharpCodeProvider ccp = new CSharpCodeProvider();   
  4. CompilerParameters param = new CompilerParameters(new string[] { "System.dll" });   
  5. CompilerResults cr = ccp.CompileAssemblyFromSource(param, codeString);   
  6. Type type = cr.CompiledAssembly.GetType(className);   
  7. return type.GetConstructor(System.Type.EmptyTypes).Invoke(null);   

即可有運行時動態的創建我們需要的參數對象。

以后就可以方便的在XML注冊路由了。

public static void Register(this RouteCollection routes)  對 RouteCollection 對象添加了擴展方法

引入對應的命名空間后就方便的注冊了。

改進后的注冊方法

  1.  public static void RegisterRoutes(RouteCollection routes)   
  2.  {   
  3.  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");   
  4.  }   
  5. protected void Application_Start()   
  6.  {   
  7. RegisterRoutes(RouteTable.Routes);   
  8.  //執行RouteCollection的擴展方法 用來注冊XML文件中的路由配置信息   
  9. RouteTable.Routes.Register();   
  10.  } 

代碼下載地址

/tandly/MvcRouteHelper.rar

原文標題:ASP.NET MVC路由規則XML化

鏈接:http://www.cnblogs.com/tandly/archive/2010/03/10/1682301.html

【編輯推薦】

  1. 專訪微軟MVP衣明志:走進ASP.NET MVC 2框架開發
  2. 詳解ASP.NET MVC 2中強類型HTML輔助方法
  3. ASP.NET MVC 2 RC版全新發布 增強HTML控制
  4. 詳解ASP.NET MVC 2自定義驗證
  5. 詳解ASP.NET MVC對表進行通用的增刪改 
     
責任編輯:彭凡 來源: 博客園
相關推薦

2009-07-31 12:43:59

ASP.NET MVC

2009-07-23 14:31:20

ASP.NET MVC

2009-07-22 15:02:02

ASP.NET MVC

2009-04-08 09:58:07

ASP.NET MVCTempData框架

2009-07-20 10:33:02

ASP.NET MVC

2009-07-22 09:11:02

Action方法ASP.NET MVC

2009-08-04 17:28:45

Apache支持ASP

2014-08-21 09:31:06

路由

2009-07-27 15:34:11

MembershipASP.NET

2009-08-05 18:36:12

ASP.NET Che

2009-07-24 13:41:15

ASP.NET AJA

2009-07-24 10:55:00

asp.net mvc

2009-07-27 10:18:12

TypeResolveASP.NET

2009-07-23 15:11:43

XML Web服務方法ASP.NET

2009-07-24 10:53:51

ASP.NET實現靜態

2009-08-05 15:50:13

ASP.NET優點

2009-07-22 18:03:00

ASP.NET ASP

2009-07-27 09:29:38

ASP.NET中Jav

2009-07-24 13:20:44

MVC框架ASP.NET

2009-09-24 09:26:22

ASP.NET MVC
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产视频黄色 | 成人亚洲精品久久久久软件 | 就操在线 | 777zyz色资源站在线观看 | www.久久.com| 国产第一页在线播放 | 亚洲深夜福利 | 亚洲成人精品国产 | 欧美亚洲国语精品一区二区 | 久久青草av | 日本aaa视频 | 国产韩国精品一区二区三区 | com.色.www在线观看 | 亚洲视频免费观看 | 亚洲高清在线 | av免费观看网站 | 成人精品毛片国产亚洲av十九禁 | 亚洲成人自拍 | 午夜影院污 | 亚洲日韩中文字幕一区 | 久久久久久久久久久福利观看 | 丝袜久久 | 精品一区二区观看 | 久草影视在线 | 丝袜毛片 | 久久久精品一区 | 欧美一二三| 国产精品久久久久婷婷二区次 | 91精品导航 | 免费h在线 | 成人影院在线视频 | 亚洲成人av| 亚洲精品九九 | 91精品中文字幕一区二区三区 | 亚洲一区二区三区在线视频 | 欧美高清视频一区 | 亚洲一区久久 | 色视频免费 | av在线一区二区 | 色久伊人 | 欧美1区2区 |