IT貓撲網(wǎng):您身邊最放心的安全下載站! 最新更新|軟件分類|軟件專題|手機(jī)版|論壇轉(zhuǎn)貼|軟件發(fā)布

您當(dāng)前所在位置:首頁(yè)網(wǎng)絡(luò)編程.Net編程 → 淺析ASP.NET MVC路由規(guī)則XML化的方法

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

時(shí)間:2015/6/28來(lái)源:IT貓撲網(wǎng)作者:網(wǎng)管聯(lián)盟我要評(píng)論(0)

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

  public static void RegisterRoutes(RouteCollection routes)

  {

  routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  routes.MapRoute( "User",

  // Route name

  "{controller}/{action}/{id}",

  // URL with parameters     new { controller = "User", action = "Show", id = "0" }

  // Parameter defaults

  );

  }

  protected void Application_Start()

  {

  RegisterRoutes(RouteTable.Routes);

  }

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

  以下是 自定義的XML 格式

  <?xml version="1.0" encoding="utf-8" ?>    <MapRoutes>  <!--默認(rèn)規(guī)則-->

  <MapRoute name="Default" url="{controller}/{action}">      <Params>

  <Item key="controller" default="Article"/>

  <Item key="action" default="Index"/>

  </Params>

  </MapRoute>

  <!--顯示新聞列表的路由規(guī)則-->

  <MapRoute name="ShowArticleList" url="{controller}/{action}/{typeId}/{pageIndex}/{pageSize}">

  <Params>

  <Item key="controller" default="Article"/>

  <Item key="action" default="Index"/>

  <Item key="typeId" default="1"/>

  <Item key="pageIndex" default="1"/>

  <Item key="pageSize" default="10"/>

  </Params>

  </MapRoute>

  </MapRoutes>  以下是全部代碼

  ***********************************************/

  using System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Text;

  using System.Web.Routing;

  using System.Web.Mvc;

  using System.Xml.Linq;

  using Microsoft.CSharp;

  using System.CodeDom.Compiler;

  namespace Tension.Mvc

  {

  public static class RouteHelper

  {

  /// <summary>

  /// 從XML文件中注冊(cè)路由規(guī)則

  /// </summary>

  /// <param name="routes"></param>

  /// <param name="cfgFile"></param>

  public static void Register(this RouteCollection routes, string cfgFile)

  {

  IList<Route> Routes = GetRoutes(cfgFile);

  foreach (var item in Routes)

  {

  //路由規(guī)則對(duì)象

  object obj = CreateObjectFormString(item.ToString(), item.Name);

  routes.MapRoute(

  item.Name,

  // Route name

  item.Url,

  // URL with parameters

  obj

  // Parameter defaults

  );

  }

  }

  /// <summary>

  ///  從XML文件中注冊(cè)路由規(guī)則 默認(rèn)文件為網(wǎng)站根目錄下MapRoute.config

  /// </summary> /// <param name="routes"></param>

  public static void Register(this RouteCollection routes)

  {

  Register(routes, string.Format("{0}\\MapRoute.config", Tension.ServerInfo.GetRootPath()));

  }

  /// <summary>

  /// 從string動(dòng)態(tài)創(chuàng)建類對(duì)象

  /// </summary>

  /// <param name="codeString"></param>

  /// <param name="className"></param>

  /// <returns></returns>

  private static object CreateObjectFormString(string codeString, string className)

  {

  CSharpCodeProvider ccp = new CSharpCodeProvider();

  Compilerparameters param = new CompilerParameters(new string[] { "System.dll" });

  CompilerResults cr = ccp.CompileAssemblyFromSource(param, codeString);

  Type type = cr.CompiledAssembly.GetType(className);

  return type.Getconstructor(System.Type.EmptyTypes).Invoke(null);

  }

#p#副標(biāo)題#e#

  /// <summary>    /// 從XML文件中解析路由規(guī)則    /// </summary>

  /// <param name="configFile"></param>    /// <returns></returns>

  private static IList<Route> GetRoutes(string configFile)

  {

  StringBuilder sb = new StringBuilder();

  Console.WriteLine(sb.ToString());

  IList<Route> Routes = new List<Route>();

  XElement xe = XElement.Load(configFile);

  #region MyRegion    foreach (var item in xe.Elements("MapRoute"))

  {

  名稱屬性    XAttribute xaName = item.Attribute("name");

  if (xaName == null || string.IsNullOrEmpty(xaName.Value))

  {

  throw new ArgumentNullException("name!說(shuō)明:路由配置文件中某規(guī)則缺少name屬性或name屬性的值為空字符串");

  }

  //URL屬性    XAttribute urlName = item.Attribute("url");

  if (urlName == null || string.IsNullOrEmpty(urlName.Value))

  {

  throw new ArgumentNullException("url!說(shuō)明:路由配置文件中某規(guī)則缺少url屬性或url屬性的值為空字符串");

  }

  Dictionary<string, string> DictParams = new Dictionary<string, string>();

  #region MyRegion

  foreach (var pItem in item.Element("Params").Elements("Item"))

  {

  XAttribute itemKey = pItem.Attribute("key");

  if (itemKey == null || string.IsNullOrEmpty(itemKey.Value))

  {

  throw new ArgumentNullException("Item->key!說(shuō)明:路由配置文件中某規(guī)則缺少Item->key屬性或Item->key屬性的值為空字符串");

  }

  XAttribute itemDefault = pItem.Attribute("default");

  if (itemDefault == null || string.IsNullOrEmpty(itemDefault.Value))

  {

  throw new ArgumentNullException("Item->default!說(shuō)明:路由配置文件中某規(guī)則缺少Item->default屬性或Item->default屬性的值為空字符串");

  }

  DictParams.Add(itemKey.Value, itemDefault.Value);

  }

  #endregion    Routes.Add(new Route()

  {

  Name = xaName.Value, Url = urlName.Value, Params = DictParams });

  }

  #endregion     return Routes;

  }

  }

  /// <summary>     /// 路由規(guī)則     /// </summary>

  public class Route     {

  public string Name { get; set; }

  public string Url { get; set; }

  public Dictionary<string, string> Params { get; set; }

  /// <summary>    /// 重寫ToString 方法 產(chǎn)生需要?jiǎng)討B(tài)代碼段

  /// </summary>      /// <returns></returns>     public override string ToString()

  {

  StringBuilder sb = new StringBuilder();

  sb.

關(guān)鍵詞標(biāo)簽:ASP.NET,MVC,路由規(guī)則

相關(guān)閱讀

文章評(píng)論
發(fā)表評(píng)論

熱門文章 手把手教你用好LINQ to SQL手把手教你用好LINQ to SQL在.NET環(huán)境下為網(wǎng)站增加IP過(guò)濾功能在.NET環(huán)境下為網(wǎng)站增加IP過(guò)濾功能ASP.NET 如何避免頁(yè)面重新整理時(shí)重復(fù)送出ASP.NET 如何避免頁(yè)面重新整理時(shí)重復(fù)送出用Asp.net擴(kuò)展ExtJS用Asp.net擴(kuò)展ExtJS

相關(guān)下載

人氣排行 asp.net表單提交方法GET\POST在ASP.NET中如何判斷用戶IE瀏覽器的版本Asp.net中messagebox的實(shí)現(xiàn)方法Asp.net中的web.config配置在ASP.NET MVC中實(shí)現(xiàn)大文件異步上傳用Iformattable接口控制.Net中文本格式c#.Net經(jīng)典面試題目用Asp.net擴(kuò)展ExtJS