ASP.NET MVC-轻松理解Routing(路由)

先来看下面两个个url,对比一下:

  1. http://xxx.yyy.com/Admin/UserManager.aspx
  2. http://xxx.yyy.com/Admin/DeleteUser/1001 

   对于第1个Url,假设它与服务器上的文件有直接的关系,那么服务器在接受客户端请求并将对应的文件传送给客户端。我们大概可以猜到它是对用户管理的一个页面,它的物理文件UserManager.aspx在网站根目录下面的Admin文件夹中。而第2个url,在不知道Mvc路由以及Url重写时,很难猜到这个Url背后具体有些什么,前提条件是基于.Net框架开发的Web项目。 那么在这里,我们引入Asp.Net Mvc Url路由这个概念,也正是本文所要阐述的主题,Url路由模块是负责映射从浏览器请求到特定的控制器动作。

  基于上面提到的Url路由以及其作用,我们就大概能猜到第2个Url背后有些啥了。 自然而然的Admin就是控制器了,DeleteUser是控制器里面的动作及Action了,1001就是Action的参数。到这里我们对Url路由有一个简单的认识,那么接着看下面一组url,假设Home是控制器,Index是控制器里面的Action,至于1001或者2345这类数据我们暂且约定为参数:

  1. http://xxx.yyy.com
  2. http://xxx.yyy.com/Home/1001
  3. http://xxx.yyy.com/Index/1001
  4. http://xxx.yyy.com/Home/Index/1001/2345
  5. http://xxx.yyy.com/System/Home/Index/1001

按照约定,从上面的几组Url中可以看出,有的缺控制器,有的缺Action,有的带有好几个参数,有的又莫名的多出了控制器、Action、参数之外的东西,那么他们能正确的访问吗?

  注册路由

    在vs2012里面新建一个asp.net mvc4 web 应用程序项目,可以在项目的根目录下App_Start里面看到RouteConfig文件,在这个文件里面就可以添加url路由了。在文件里面可以看到MapRoute 这个方法,它是RouteCollection的扩展方法,并且含有多个重载,下面看看MapRoute方法的参数,这里选参数最多的那个:

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);

从上面的代码片段大概可以看出该方法含有路由名称、路由的Url、默认值、约束、首先查找路由所在的命名空间,该方法是返回对映射路由的引用。不过在RouteConfig文件中我们可以看到添加路由的代码:

routes.MapRoute(
  name: "Default",
  url: "{controller}/{action}/{id}",
  defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

稍微分析一下这段代码可以知道,在路由集合里面添加了一个名为"Default"的路由,并且有一个默认的路由指向,指向名称为Home的控制器,并且Action为Index,可以明显的看到这里 "id = UrlParameter.Optional" 的写法,它的意思就是说Action的参数可以不需要用户来指定,可以缺省。

引言
  听到路由两字,想必首先想到的会是计算机网络中的路由,通过分组转发来将不同的数据包发送到对应的目的地址。其核心是路由表,表中记录了如何到达各目的地。

  ASP.NET MVC(下文都用MVC来特指ASP.NET MVC)中的Routing同样的也是完成这件事。用户提交请求后,系统根据路由表将请求送至相应的Controller中,然后为用户请求做出响应。

概念
  在Web应用中,我们都会通过URL(俗称网址)来发送我们对页面的请求,打开浏览器,输入我们将要访问网站的网址,然后等待浏览器加载我们期待的页面。

传统的Web Form开发,URL映射到的是一个具体的处理程序,磁盘上的物理文件,如一个aspx文件。

MVC中多数情况下是将URL映射到Controller和Controller下的Action。

  一个仓库,传统的方式是用户直接拥有货物的地址,知道货物的具体位置,哪一个货架,哪一行,哪一列。而MVC则是用户需要告诉前台的仓库保管员,由仓库保管员找到用户需要的货物并交给用户。
--------------------- 
 

过程

  在学习路由时,我觉得我们应该清楚MVC是如何处理请求并响应的。控制器中类的每个公共方法被称为Action方法。ASP.NET路由系统内部根据请求的URL和路由配置调用对应的Action方法,完成处理操作后,再选择一个视图呈现给客户端.

路由表

Default

  当新建一个新的MVC应用程序(以MVC3为例),会默认配置ASP.NET路由。在Global.asax文件中创建了一个Default路由表。

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                "Default", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值
            );

        }
 

 一个MVC应用程序首次运行时,会调用Application_Start()方法。这个方法随后调用了RegisterRoutes()方法。RegisterRoutes()方法创建了路由表。

  默认路由映射:

第一部分——Controller

第二部分——Controller下的Action

第三部分——名为id的参数

  所谓默认路由,表明如果不填写Controller,会默认定位HomeController,如果不填写Action,会默认调用Index方法,如果不填写id,那么默认为空字符串。

  即以下这些URL都会定位到HomeController.Index()方法,返回Index View视图。

http://localhost:38226/

http://localhost:38226/Home

http://localhost:38226/Home/Index
 

Custom

  对于多数简单的MVC应用程序来讲,默认的路由表已经足够用了,不过如果有特殊的路由需求,还可以建立自定义的路由表。

  需要注意的是,我们应当把自定义的路由添加到默认路由前面,注意路由顺序。

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
            routes.MapRoute(
                "Blog",                                           // 路由名称,自定义的路由
                "Archive/{entryDate}",                            // 带有参数的 URL
                new { controller = "Archive", action = "Entry" }  // 参数默认值
            );
            routes.MapRoute(
                "Default",                                              // 路由名称
                "{controller}/{action}/{id}",                           // 带有参数的 URL
                new { controller = "Home", action = "Index", id = "" }  // 参数默认值
            );
        }
 

小结

  Routing不是只有MVC应用程序才会有,ASP.NET 4.0后,ASP.NET MVC的路由规则全部可以用于WebForms。

猜你喜欢

转载自blog.csdn.net/farmwang/article/details/85292620