自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析ASP.NET MVC路由規(guī)則XML化的方法

開(kāi)發(fā) 后端
本文由作者為大家介紹ASP.NET MVC路由規(guī)則XML化的方法,希望對(duì)大家的開(kāi)發(fā)有所幫助。

本文主要針對(duì)的是ASP.NET MVC路由規(guī)則的問(wèn)題,作者本次所研究的是ASP.NET MVC路由規(guī)則XML,希望那個(gè)通過(guò)本文能對(duì)大家有所幫助。

最近由于工作關(guān)系,重新回顧了ASP.NET MVC的1.0 版本。2.0版本還沒(méi)有研究。

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

  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.     }  

默認(rèn)硬編碼的方式使得以后可維護(hù)程度大大降低。MVC 1.0 似乎沒(méi)有提供很好的基于配置文件的路由規(guī)則設(shè)置。所以只好自己實(shí)現(xiàn)了。直到寫(xiě)這篇文章時(shí),才找到了一個(gè)比較好的解決方案。

以下是 自定義的XML 格式

  1. <?xml version="1.0" encoding="utf-8" ?>    
  2. <MapRoutes>  
  1. <!--默認(rèn)規(guī)則-->    
  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.  <!--顯示新聞列表的路由規(guī)則-->    
  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 任何轉(zhuǎn)載請(qǐng)務(wù)必保留此頭部信息 版權(quán)所有 盜版必究    
  3.  * Email:tension1990@hotmail.com     
  4.  * 描述 :    
  5.  * 創(chuàng)建時(shí)間: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文件中注冊(cè)路由規(guī)則    
  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.                  //路由規(guī)則對(duì)象    
  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文件中注冊(cè)路由規(guī)則 默認(rèn)文件為網(wǎng)站根目錄下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動(dòng)態(tài)創(chuàng)建類對(duì)象    
  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文件中解析路由規(guī)則    
  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!說(shuō)明:路由配置文件中某規(guī)則缺少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!說(shuō)明:路由配置文件中某規(guī)則缺少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!說(shuō)明:路由配置文件中某規(guī)則缺少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!說(shuō)明:路由配置文件中某規(guī)則缺少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.  /// 路由規(guī)則    
  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. /// 重寫(xiě)ToString 方法 產(chǎn)生需要?jiǎng)討B(tài)代碼段    
  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. }  

在實(shí)現(xiàn)過(guò)程中遇到的最大問(wèn)題就是 參數(shù)列表的動(dòng)態(tài)裝載 看一下以下代碼

  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.  );  

這是硬編碼實(shí)現(xiàn)的路由規(guī)則注冊(cè)

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

該對(duì)象如何動(dòng)態(tài)構(gòu)建成了難題。(才疏學(xué)淺)

嘗試著傳入一個(gè) Dictionary<K,T> 但是沒(méi)有用,ASP.NET 解析這個(gè)參數(shù)的時(shí)候是以反射形式讀取的對(duì)象屬性。

后來(lái)想到了使用代碼段 在運(yùn)行時(shí)動(dòng)態(tài)創(chuàng)建對(duì)象。

我們將類似代碼段

  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);   

即可有運(yùn)行時(shí)動(dòng)態(tài)的創(chuàng)建我們需要的參數(shù)對(duì)象。

以后就可以方便的在XML注冊(cè)路由了。

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

引入對(duì)應(yīng)的命名空間后就方便的注冊(cè)了。

改進(jìn)后的注冊(cè)方法

  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.  //執(zhí)行RouteCollection的擴(kuò)展方法 用來(lái)注冊(cè)XML文件中的路由配置信息   
  9. RouteTable.Routes.Register();   
  10.  } 

代碼下載地址

/tandly/MvcRouteHelper.rar

原文標(biāo)題:ASP.NET MVC路由規(guī)則XML化

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

【編輯推薦】

  1. 專訪微軟MVP衣明志:走進(jìn)ASP.NET MVC 2框架開(kāi)發(fā)
  2. 詳解ASP.NET MVC 2中強(qiáng)類型HTML輔助方法
  3. ASP.NET MVC 2 RC版全新發(fā)布 增強(qiáng)HTML控制
  4. 詳解ASP.NET MVC 2自定義驗(yàn)證
  5. 詳解ASP.NET MVC對(duì)表進(jìn)行通用的增刪改 
     
責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

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-07-20 10:33:02

ASP.NET MVC

2009-04-08 09:58:07

ASP.NET MVCTempData框架

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-24 10:55:00

asp.net mvc

2009-07-23 15:11:43

XML Web服務(wù)方法ASP.NET

2009-09-24 09:26:22

ASP.NET MVC

2009-07-27 10:18:12

TypeResolveASP.NET

2009-11-02 10:15:53

ASP.NET MVC

2009-07-30 13:45:40

ASP.NET開(kāi)發(fā)模式MVC模式

2009-08-05 15:50:13

ASP.NET優(yōu)點(diǎn)

2009-07-27 09:29:38

ASP.NET中Jav

2009-07-20 16:09:39

2015-01-07 09:32:50

ASP.NET MVC路由

2009-07-22 09:36:54

使用UpdataModASP.NET MVC

2009-07-27 15:34:11

MembershipASP.NET
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)