MVC(五)--路由机制

Posted on 2016-09-28 12:38  影飞影  阅读(182)  评论(0)    收藏  举报

MVC(五)--路由机制


标签: 

mvc

 

路由机制

 

global文件

 

it

分类: 编程

一、Routing(路由)的作用
1、匹配传入的请求(不匹配服务器物理文件);
2、将请求映射到 控制器 的具体操作 Action方法 和 参数;
3、调用并执行对应 控制器 类的 Action 方法;

 

*好的Url应该满足如下条件:
1、URL应为获取某种资源提供信息,不一定是物理文件路径;
2、简短易于记忆和拼写输入;
3、可以反映出站点结构;
4、应该是【可拆分】,用户移除末尾,进而获得更高层次信息;
5、持久、不应改变。

二、Routing(路由)包含字面值的URL
1、路由URL在段中也允许包含【字面值】,如:/gz/{controller}/{action}/{id}
   //规定第一个段必须以 gz 开头,才能与该路由匹配,如:/gz/home/index/1

2.URL中可以字面量和参数混合在一期,如:
{controller}-{action}-{id} 匹配:/Home-Index-1
{controller}.{action}.{id}  匹配:/Home.Index.1
{controller}/{action}-{id}  匹配:/Home/Index-1
{controller}/{action}-{month}/{day}  匹配:/Home/Index-1/24
但,不能有两个连续的url参数 :{controller}{action}-{id}


三、路由约束

1、 Global.asax.cs文件中定义了路由的识别规则
      Routes.MapRoute(
         "Default", // 1.路由名称
         "{controller}/{action}/{id}", // 2.带有参数的URL
          new {
                   controller = "Home",
                   action = "Index",
                   id = UrlParameter.Optional
                 } // 3.参数默认值
       );

 
2、允许URL段使用正则表达式来限制路由是否匹配请求,而且可以指定优先匹配命名空间

routes.MapRoute(
                "blog", // 路由名称
                "{controller}/{action}/{id}", // 带有参数的 URL
                new {

                      controller = "Home",

                      action = "Index",

                      id = UrlParameter.Optional

                     },// 参数默认值                 

               constraints: new { action = @"[a-zA-z]+", id = @"\d+" },

           namespaces: new string[] { "MyBlog.Controller" }//优先找 命名空间 为 MyBlog.Controller
            );
路由按照先后顺序与传入的URL匹配,直到匹配成功为主


四、Area 区域

1. MVC 项目目录结构 缺点:1.不利于分功能协作开发(购物车/商品管理/用户权限管理…);2.代码结构臃。

2. 可使用Area区域解决,甚至可以从物理上分开。Area文件夹包含:
(1)一套新的MVC文件夹
(2)AreaRegistration.cs文件,如:

  public class AdminAreaAreaRegistration : AreaRegistration
    {

        public override string AreaName
        {

         //AreaName区域名:唯一用途就是在在加载视图的时候找视图,添加一个特殊的路径。

         //视图引擎在加载视图时,其匹配的路由是通过区域注册类添加的,那么就会检查AreaName属性,
立即在路径添加~/Areas,并根据AreaName属性的返回值,生成视图。
            get
            {
                return "AdminArea";
            }
        }

        //注册当前区域路由信息(也是添加到了 路由表 中!)
        public override void RegisterArea(AreaRegistrationContext context)
        {
            context.MapRoute(
                "AdminArea_default",
                "AdminArea/{controller}/{action}/{id}",
                new { action = "Index", id = UrlParameter.Optional }
            );
        }
    }

 

//路由表其实在Global.asax文件中,此方法会在网站被浏览器第一次请求的时候执行(且只会被执行一次!)

protected void Application_Start()
        {
            //1.注册区域
            AreaRegistration.RegisterAllAreas();

            //2.注册配置
            WebApiConfig.Register(GlobalConfiguration.Configuration);

            //3.注册 过滤器
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

            //4.注册 路由配置
            RouteConfig.RegisterRoutes(RouteTable.Routes);

            //5.注册 绑定在一起 静态文件(节约浏览器的请求次数 和 服务器发送的数据量)
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

3、Area 区域运行原理:

      MVC 框架会根据路由到当前程序集和所有的引用程序集查找符合命名规则的控制器类。找控制器类的时候有两个条件:是Contoller类的子类,而且类的命名必须以Controller结尾。
    MVC 框架会先到自己的项目去找,然后再去其他项目去找controller和index。如果找到多个同名的controller,就会无法识别,所以在注册路由的时候还要加上命名空间的约束(1.限制查找的范围;2.避免出现多个同名控制器类不知道用哪个)。如果在指定命名空间的时候找不到,就会找其他命名空间的相应控制器