zoukankan      html  css  js  c++  java
  • 使用XML文件来动态配置ASP.NET MVC的Route规则 【转】

    一般情况下,我们都是直接在Global.asax.cs文件中直接写上Route规则的,例如:

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        routes.MapRoute(
            "Default",                                              // Route name
            "{controller}/{action}/{id}",                           // URL with parameters
            new { controller = "Home", action = "Index", id = "" }  // Parameter defaults
        );
    }

    这样在我们的程序编译、部署后,我们想修改这个Route规则就得重新修改程序中Global.asax.cs文件中的Route规则=>编译=>部署,不可以做到动态配置。

    其实我们可以做到动态配置,我们可以将这个Route规则写到一个XML文件中,例如这样:

    <RouteConfiguration>
      <ignore>
        <!--忽略对.axd文件的Route,直接处理-->
        <add url="{resource}.axd/{*pathInfo}" >
          <constraints>
            <!--添加约束,value是乱写的,只为演示-->
            <add name="resource" value="\w" />
          </constraints>
        </add>
      </ignore>
      <map>
        <route name="Post" url="Post/{id}" controller="Home" action="Post" >
          <parameters>
            <!--添加参数默认值-->
            <!--添加约束,id必须为GUID-->
            <add name="id" value="" constraint="[\da-f]{8}-[\da-f]{4}-[\da-f]{4}-[\da-f]{4}-[\da-f]{12}" />
          </parameters>
        </route>
        <route name="Default" url="{controller}/{action}/{id}" controller="Home" action="Index" >
          <parameters>
            <add name="id" value="" />
          </parameters>
        </route>
      </map>
    </RouteConfiguration>

    我们例如Web.config中的configSection来写我们的自定义配置节,来配置上面的XML文件。首先,我需要写一个定义的configSection,他继承自ConfigurationSection,如下:

    public class MvcRouteConfigurationSection : ConfigurationSection
    {
        [ConfigurationProperty("ignore", IsRequired=false)]
        public IgnoreCollection Ignore
        {
            get
            {
                return (IgnoreCollection)(this["ignore"]);
            }
        }
    
        [ConfigurationProperty("map", IsRequired=false)]
        public RoutingCollection Map
        {
            get
            {
                return (RoutingCollection)(this["map"]);
            }
        }
    }

    然后我们写一个扩展方法来自定义将我们配置好的Route规则写入到程序路由表中:

    public static void MapRoute(
        this System.Web.Routing.RouteCollection routes, 
        MvcRouteConfigurationSection section )
    {
        // Manipulate the Ignore List
        foreach(IgnoreItem ignoreItem in section.Ignore)
        {
            RouteValueDictionary ignoreConstraints = new RouteValueDictionary();
    
            foreach (Constraint constraint in ignoreItem.Constraints)
                ignoreConstraints.Add(constraint.Name, constraint.Value);
    
            IgnoreRoute(routes, ignoreItem.Url, ignoreConstraints);
        }
    
        // Manipluate the Routing Table
        foreach (RoutingItem routingItem in section.Map)
        {
            RouteValueDictionary defaults = new RouteValueDictionary();
            RouteValueDictionary constraints = new RouteValueDictionary();
    
            if (routingItem.Controller != string.Empty)
                defaults.Add("controller", routingItem.Controller);
    
            if (routingItem.Action != string.Empty)
                defaults.Add("action", routingItem.Action);
    
            foreach (Parameter param in routingItem.Paramaters)
            {
                defaults.Add(param.Name, param.Value);
                if (!string.IsNullOrEmpty(param.Constraint))
                {
                    constraints.Add(param.Name, param.Constraint);
                }
            }
    
            MapRoute(routes, routingItem.Name, routingItem.Url, defaults, constraints);
        }
    }
    

    然后在web.config中的configSections配置节下加入我们写好的MvcRouteConfigurationSection

    <section name="RouteConfiguration" type="MvcXmlRouting.MvcRouteConfigurationSection"/>

    最后,在Global.asax.cs中用我们刚才写的MapRoute扩展方法来注册我们的Route规则:

    public class MvcApplication : System.Web.HttpApplication
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            MvcRouteConfigurationSection section = 
                (MvcRouteConfigurationSection)ConfigurationManager.GetSection("RouteConfiguration");
    
            routes.MapRoute(section);
        }
    
        protected void Application_Start()
        {
            RegisterRoutes(RouteTable.Routes);
        }
    }
    

    OK,大功告成。Enjoy! by Q.Lee.lulu.

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

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

    本文示例代码下载:XmlRout.Web.rar

  • 相关阅读:
    [NOIP2013] 提高组 洛谷P1979 华容道
    Vijos P1404 遭遇战
    CodeVS 1506 传话
    P1546 最短网络 Agri-Net
    HDU 4747 Mex
    POJ1020 Anniversary Cake
    【数据结构】平衡二叉树
    【数据结构】二叉排序树
    【数据结构】二叉树
    概念源于生活
  • 原文地址:https://www.cnblogs.com/cxd4321/p/1573417.html
Copyright © 2011-2022 走看看