一般情况下,我们都是直接在Global.asax.cs文件中直接写上Route规则的,例如:
  1. public static void RegisterRoutes(RouteCollection routes)
  2. {
  3.     routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

  4.     routes.MapRoute(
  5.         "Default",                                              // Route name
  6.         "{controller}/{action}/{id}",                          // URL with parameters
  7.         new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
  8.     );
  9. }
复制代码
这样在我们的程序编译、部署后,我们想修改这个Route规则就得重新修改程序中Global.asax.cs文件中的Route规则=>编译=>部署,不可以做到动态配置。

其实我们可以做到动态配置,我们可以将这个Route规则写到一个XML文件中,例如这样:
  1. <RouteConfiguration>
  2.   <ignore>
  3.     <!--忽略对.axd文件的Route,直接处理-->
  4.     <add url="{resource}.axd/{*pathInfo}" >
  5.       <constraints>
  6.         <!--添加约束,value是乱写的,只为演示-->
  7.         <add name="resource" value="\w" />
  8.       </constraints>
  9.     </add>
  10.   </ignore>
  11.   <map>
  12.     <route name="Post" url="Post/{id}" controller="Home" action="Post" >
  13.       <parameters>
  14.         <!--添加参数默认值-->
  15.         <!--添加约束,id必须为GUID-->
  16.         <add name="id" value="" constraint="[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}" />
  17.       </parameters>
  18.     </route>
  19.     <route name="Default" url="{controller}/{action}/{id}" controller="Home" action="Index" >
  20.       <parameters>
  21.         <add name="id" value="" />
  22.       </parameters>
  23.     </route>
  24.   </map>
  25. </RouteConfiguration>
复制代码
我们例如Web.config中的configSection来写我们的自定义配置节,来配置上面的XML文件。首先,我需要写一个定义的configSection,他继承自ConfigurationSection,如下:
  1. public class MvcRouteConfigurationSection : ConfigurationSection
  2. {
  3.     [ConfigurationProperty("ignore", IsRequired=false)]
  4.     public IgnoreCollection Ignore
  5.     {
  6.         get
  7.         {
  8.             return (IgnoreCollection)(this["ignore"]);
  9.         }
  10.     }

  11.     [ConfigurationProperty("map", IsRequired=false)]
  12.     public RoutingCollection Map
  13.     {
  14.         get
  15.         {
  16.             return (RoutingCollection)(this["map"]);
  17.         }
  18.     }
  19. }
复制代码
然后我们写一个扩展方法来自定义将我们配置好的Route规则写入到程序路由表中:
  1. public static void MapRoute(
  2.     this System.Web.Routing.RouteCollection routes,
  3.     MvcRouteConfigurationSection section )
  4. {
  5.     // Manipulate the Ignore List
  6.     foreach(IgnoreItem ignoreItem in section.Ignore)
  7.     {
  8.         RouteValueDictionary ignoreConstraints = new RouteValueDictionary();

  9.         foreach (Constraint constraint in ignoreItem.Constraints)
  10.             ignoreConstraints.Add(constraint.Name, constraint.Value);

  11.         IgnoreRoute(routes, ignoreItem.Url, ignoreConstraints);
  12.     }

  13.     // Manipluate the Routing Table
  14.     foreach (RoutingItem routingItem in section.Map)
  15.     {
  16.         RouteValueDictionary defaults = new RouteValueDictionary();
  17.         RouteValueDictionary constraints = new RouteValueDictionary();

  18.         if (routingItem.Controller != string.Empty)
  19.             defaults.Add("controller", routingItem.Controller);

  20.         if (routingItem.Action != string.Empty)
  21.             defaults.Add("action", routingItem.Action);

  22.         foreach (Parameter param in routingItem.Paramaters)
  23.         {
  24.             defaults.Add(param.Name, param.Value);
  25.             if (!string.IsNullOrEmpty(param.Constraint))
  26.             {
  27.                 constraints.Add(param.Name, param.Constraint);
  28.             }
  29.         }

  30.         MapRoute(routes, routingItem.Name, routingItem.Url, defaults, constraints);
  31.     }
  32. }
复制代码
然后在web.config中的configSections配置节下加入我们写好的MvcRouteConfigurationSection :

<section name="RouteConfiguration" type="MvcXmlRouting.MvcRouteConfigurationSection"/>
最后,在Global.asax.cs中用我们刚才写的MapRoute扩展方法来注册我们的Route规则:
  1. public class MvcApplication : System.Web.HttpApplication
  2. {
  3.     public static void RegisterRoutes(RouteCollection routes)
  4.     {
  5.         MvcRouteConfigurationSection section =
  6.             (MvcRouteConfigurationSection)ConfigurationManager.GetSection("RouteConfiguration");

  7.         routes.MapRoute(section);
  8.     }

  9.     protected void Application_Start()
  10.     {
  11.         RegisterRoutes(RouteTable.Routes);
  12.     }
  13. }
复制代码
OK,大功告成。Enjoy! by Q.Lee.lulu.

原文见:ASP.NET MVC Routing Using XML Custom Configuration Settings

本文的示例代码在原文的代码基础上添加了对约束(constraints)的支持!(文/Q.Lee.lulu

本文示例代码下载:
TOP