网络百家乐


网络百家乐夏雨来时急欲狂,周天日照近无光。
网络百家乐我:“爹、妈,我决定从现在起,自己独立,一个人住啦。”父母:“好啊儿子,真棒!”我:“你们的行李我放在门口啦。”网络百家乐中学的时候老师让同学们每人表演一个节目,轮到同桌的时候,他拿本书放大腿上,人坐在凳子上,然后盯着某位女生,看了一会说“表演开始了啊,会移动的书!” 结果书真的动了。当时很多女同学还不明白,还以为是什么厉害的魔术。只有班主任铁青着个脸站在一旁。网络百家乐队友网络百家乐很快,他们确定了几个客人了,包括当时郝仁叫一个少年让位的二世祖,还有许多老顾客。虽然他们不认识郝仁,不过他们还是说一个大概,没有想到这个杀手竟有郝仁的相片。当他拿出郝仁的相片,这个务员就点头说是他了!网络百家乐一个歪戴着帽子,  嘴里叼着烟卷的年轻人  在电车上想戏弄一下售票员:  “我只买小孩票行吗,售票员?”  售票员只是瞧了一眼年轻人说:  “对不起,我们这里是按年龄收费,  不是按智力收费。”  年轻人:“。。。。”网络百家乐老肖先是找到阿毛,一口咬定我就是老千,埋怨阿毛找来了高手也不带着他一块儿发财。阿毛被他缠得没办法也只好说出了实情,我确实是他从北京找来的老千,因为生意不好,想赢点钱贴补一下。但是现在老肖加入得有点晚,因为我前期赢得有点猛,这条街上的人已经不太愿意和我打牌了,所以我打算近期就回北京了。网络百家乐一句表达对母亲的爱的话
网络百家乐行于栈道左边
网络百家乐 曾听闻人生要走遍三山五岳之地,结识五湖四海之友!所谓三山者,也就是我们常常也熟知的:安徽黄山,浙江雁荡山和江西庐山。五岳乃:东岳泰山,西岳华山,北岳恒山,南岳衡山,中岳嵩山。虽话说中国有九大名山,但想来此八大名山,想当然尔亦是祖国山岳之代表。她们遍布中国大江南北。各怀文化之特色,各显轻袿之猗髴。向来被世人所青睐,每每作歌以赞之,真可谓:前人之述备矣!
网络百家乐到了厕所,商斌压低了声音对我说:我觉得不对劲。

皇冠足球比分

大发论坛时时彩平台尊龙娱乐是黑网吗海天国际娱乐城注册送钱凯发娱乐乐宝娱乐城真人赌钱bodog888亚美国际娱乐城 金龙国际 www.am8.com 亚洲城娱乐 老k国际娱乐城 666k8.com 金威国际娱乐城 名人国际娱乐城 ag娱乐平台 V博娱乐城 http://tinyurl.com/odzpgod网站地图国语学校网站地图hg推送纪网站地图滚球网网站地图百家乐试玩注册送钱e8889.com网站地图2015博彩白菜网站地图ag平台骰宝网站地图新加坡金沙博彩网站地图真人推锅网站地图博狗主页网站地图时时彩开户【注册送钱e8889.com】网站地图bet36体育在线网站地图

自定义MVC路由配置

 


首先我用MVC4新增一个订单查看的功能


1.创建控制器OrderController

namespace MvcApplication3.Controllers
{
    public class OrderController : Controller
    {
        public ActionResult OrderView()
        {
            return View();
        }
    }
}

 

2.创建视图 OrderView

@{
    ViewBag.Title = "OrderView";
}

<h2>OrderView</h2>

 

3.Global配置路由

 public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
              "OrderView", 
              "OrderCenter/OrderView.html",
              new { controller = "Order", action = "OrderView" },
              new string[] { "MvcApplication3" }
              );

        }

 

 

我们在做MVC项目时,每次我们新增功能时,都要在golbal文件里注册下该视图的路由,当项目有10个,100个功能,那我们不配置死,而且都在一个文件里global里修改配置,维护起来非常费劲,有没有好的办法来解决这个问题尼,不用再修改global文件,就可自由的配置路由地址

让我们接下来一步步分析

首先我们看MVC路由类RouteCollection的扩展方法 MapRoute 的参数属性

        //
        // 摘要:
        //     Maps the specified URL route and sets default route values and namespaces.
        //
        // 参数:
        //   routes:
        //     A collection of routes for the application.
        //
        //   name:
        //     The name of the route to map.
        //
        //   url:
        //     The URL pattern for the route.
        //
        //   defaults:
        //     An object that contains default route values.
        //
        //   namespaces:
        //     A set of namespaces for the application.
        //
        // 返回结果:
        //     A reference to the mapped route.
        //
        // 异常:
        //   System.ArgumentNullException:
        //     The routes or url parameter is null.
        public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);

 

再看下我们在Golbal里调用此方法

routes.MapRoute(
              "OrderView",  --对应name
              "OrderCenter/OrderView.html", --对应url
              new { controller = "Order", action = "OrderView" }, --对应object
              new string[] { "MvcApplication3" } --对应namespaces
              );

看第三个参数 defaults 它包含了路由的Controller名称,Action名称,第四个参数namespaces表示这个Controller所在的命名空间,我们看看我们之前新建的控制器OrderController它的类型是class,而它下面的Action是一个返回类型是ActionResult的方法,再想到命名空间,由此我们是否可以利用反射技术来来循环读取当前应用程序下所有Controller,每个Controller的所有方法Action以及每个Controller所在命名空间

下面我们写下面一段伪代码来分析我们的思路:

  var 控制器类集合=读取当前所有控制器类();
  foreach (var 控制器 in 控制器类集合)
  {
       var action方法数组=获取控制器所有Action方法();
       var namespance=获取当前控制器所在命名空间;
       var controllerName=获取控制器名称();
       foreach(var action in action方法数组)
       {
           var actionName=获取action名称();       
           var routerUrl="OrderCenter/OrderView.html";           
           //注册
           routes.MapRoute(
                  actionName, 
                  routerUrl,
                  new { controller =controllerName, action = actionName },
                  new string[] { namespance }
                  );
       }
  }  

 

这段伪代码算是解决我们今天讲的主题问题的一部分,为什么尼,因为第二个参数url 我们无法识别或知道每个Controller路由的地址,这样问题还没有解决,我们继续苦逼的维护这我们的golbal路由文件,新增一个功能,来加个配置,如果每个Controller有个属性URL,我们可以设置这个属性,那问题不就解决了嘛,那如何给Controller添加属性尼,这里我们可以利用到C# 特性 Attribute

关于特性MSDN给的定义: 

特性提供功能强大的方法,用以将元数据或声明信息与代码(程序集、类型、方法、属性等)相关联。特性与程序实体关联后,即可在运行时使用名为“反射”的技术查询特性

特性具有以下属性:

  • 特性可向程序中添加元数据。元数据是有关在程序中定义的类型的信息。所有的 .NET 程序集都包含指定的一组元数据,这些元数据描述在程序集中定义的类型和类型成员。可以添加自定义特性,以指定所需的任何附加信息。

  • 可以将一个或多个特性应用到整个程序集、模块或较小的程序元素(如类和属性)。

  • 特性可以与方法和属性相同的方式接受参数。

  • 程序可以使用反射检查自己的元数据或其他程序内的元数据。有关更多信息。

所以我们定义一个特性类

 

 [AttributeUsage(AttributeTargets.All, Inherited = true)]
    public class RouteAddressAttribute : Attribute
    {
        public RouteAddressAttribute() 
        { }
        public RouteAddressAttribute(string name, string address)
        {
            this.Name = name;
            this.Address = address;
        }
        /// <summary>
        /// 地址 【正是我们想要的URL】
        /// </summary>
        public string Address { get; set; }
        /// <summary>
        /// 名称
        /// </summary>
        public string Name { get; set; }
    }

定义了特性类,看我们怎么用它,此时我们再看我的Controller

namespace MvcApplication3.Controllers
{
    public class OrderController : Controller
    {
       [RouteAddress(Name = "订单查看", Address = "OrderCenter/OrderView.html")]
        public ActionResult OrderView()
        {
            return View();
        }
    }
}

再把我们之前的伪代码编程成真实代码,代码实现如下

namespace MvcApplication3
{
    public class RouteMap
    {

        public static void Redirection(RouteCollection routes, string assemblyName)
        {
            Assembly assembly = Assembly.Load(assemblyName);
            Type[] types = assembly.GetTypes();
            List<string> ListAdress = new List<string>();
            foreach (Type type in types)
            {
                #region 读取所有Controller
                if (type.Name.Contains("Controller"))
                {
                    string nameSpace = type.Namespace;
                    string controller = type.Name.Replace("Controller", "");
                    string action = "";
                    string address = "";
                    string routeName = "";

                    MemberInfo[] memberInfos = type.GetMethods(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public);
                    #region 读取每个Controller的Action
                    foreach (var item in memberInfos)
                    {
                        action = item.Name;
                        routeName = type.Name + action;

                        var objAttr = item.GetCustomAttributes(typeof(RouteAddressAttribute), false);
                        if (objAttr != null && objAttr.Length > 0)
                        {
                            #region 获取特性RouteAdress
                            RouteAddressAttribute temp = (RouteAddressAttribute)objAttr.First();
                            if (temp != null)
                            {
                                address = temp.Address;

                                if (!ListAdress.Contains(address))
                                {
                                    //实现注册
                                    routes.MapRoute(routeName, address, new { controller = controller, action = action }, new string[] { nameSpace });
                                    ListAdress.Add(address);
                                }
                                else
                                    throw new Exception("存在相同路由地址:" + address);
                            } 
                            #endregion
                        }
                        else
                        {
                            #region 没加特性的则显示默认地址 Controller/Action
                            address = string.Format("{0}/{1}", controller, action);
                            if (!ListAdress.Contains(address))
                            {
                                //实现注册
                                routes.MapRoute(routeName, address, new { controller = controller, action = action }, new string[] { nameSpace });
                                ListAdress.Add(address);
                            }
                            else
                                throw new Exception("存在相同路由地址:" + address); 
                            #endregion
                        }
                    } 
                    #endregion
                } 
                #endregion
            }
        } 


    }
}

 

这样Golbal文件里我们添加一行代码就行了。

 public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            //调用
            RouteMap.Redirection(routes, "MvcApplication3");

        }

 

综上所述,利用特性,利用反射,解决了开发人员繁琐的路由配置工作。

关于特性和反射技术,大家可以看下MSDN,本文不做详细介绍。

 

posted @ 2015-11-30 14:35 苏州牛恋歌-Ryan 阅读(...) 评论(...) 编辑 收藏