zoukankan      html  css  js  c++  java
  • asp.net Mvc 路由详解,非常详细.

    关于路由的理解

    为什么要定义路由?路由的定义在开发中的工作量非常小,但是非常重要,因为任何请求都离不开路由。

    各个电商网站的 URL 使用非常灵活,都离不开路由的定义,请大家参考几家电商的 URL 如下: 

    使用路由的好处:

    能够根据系统需求,灵活的划分请求规则(不同模块请求的 URL 是不一样的)。

    屏蔽物理路径,提高系统的安全性,以上情况是无法根据 URL 分析视图文件在站点目录中的位置。

    有利于搜索引擎优化,可以将 URL 请求统一规范,以后维护中,如果页面发生变化,URL 可以保持不变。

     ASP.NET MVC 中的路由

    回顾 MVC 的工作过程,加入用户请求如下 URL,则路由的执行过程如图所示:

    ASP.NET MVC 默认路由

    RouteConfig.cs 中的 URL 规则定义如下:

    URL 模式解释:

    上面的 URL 中的参数值是:“{controller}/{action}/{id}”,称之为 URL 模式。

    该模式是一种字符串,包括一些固定的“字符字面量”和“占位符”,占位符用大括号“{}”表示。

    URL 模式规定了 URL 路径的定义规则。

    URL 模式的定义

    定义语法:

    占位符:可以是一个字符串或字符,比如“x”、“id”、“year”等。

    字面量:可能是一个比较固定的字符,比较常见的是斜杠“/”;也可以是字符串。示例如下:

    特殊规则:不能以斜杠“/”或波浪线“~”字符开头,不能包含“?”,同时占位符也不能连续。示例如下:

    URL 模式匹配示例总结:

    匹配要求:

    1  字面量:必须严格匹配,即实际请求的 URL 中的字符串和路由模式中的字面量字符串必须完全一致。

    2  大小写:URL 模式匹配是不区分大小写。

    3  常量:没有包含在大括号内的信息被作为一个常量对待;比如上面的 Course,以及在分区项目中路由的定义

     Admin/{controller}/{action}/{id}  这是分期路由的定义

    URL 模式匹配原理分析

    URL 模式匹配原理图解:

    定义多个路由

    routes.MapRoute()定义路由的要求如下:

    string[] namespaces 这个命名空间 在分区的时候用到

    可以通过不同的路由名称定义多组路由。

    定义多个路由的方法,参考如下代码:

     

    路由的匹配原则:如果一个 URL 能够在多个路由中匹配,则默认使用第一个匹配的路由。

    UrlPrameter.Optional 的参数作用是什么?该参数可以作为路由参数的默认值,当需要让“/Home/Index” 或“/Home”能正常匹配,但又不希望赋一个无意义的值,可以使用该参数。 

     路由匹配总结:

    关于{controller}/{action} 

    必不可少:在一个实际的 MVC 系统中, {controller}和{action} 必不可少,如果缺少就会找不到路径而出错。

    约定规则:这个占位符是 MVC 里面约定的,并且会被解析成控制器和对应的方法。

    位置灵活:这两个约定的占位符可以在任意位置。

    其他占位符

    仅仅占位:其他占位符只起到占位而已,比如{aa}/{bb}/{cc}是不能把 aa 解析成控制器,bb 解析成动作方法。默认要求:一个路由中,如果没有规定{controller}和{action},或者只是规定其中之一,则没有规定的部分都将使用默认值。

    如果你在路由里面没有写Controller 和 action 那么你在默认值里 一定要配

    匹配顺序 

    优先使用:多个路由匹配一个 URL,则优先匹配的会使用。

    尽量避免:定义多个路由时,尽量避免出现多匹配。

    路由数据、特殊匹配、默认值与约束

    路由数据的存储和映射

    数据存储方法:在 ASP.NET MVC 路由系统中,RouteData 对象用来保存 URL 模式和实际 URL 匹配产生的路由数据。

    数据存储格式:路由数据保存方式为:“键-值”对,RouteData 是视图基类和控制器基类的属性。

    路由和控制器的映射:{controller} 和{action} 在程序运行中的映射如图所示: 

    使用路由数据

    RouteData.Values 介绍:

    1  是 RouteValueDictionary 类型,使用方式和 Dictionary<TKey, TValue>类似。

    2  RouteData 定义为视图和控制器基类的属性。

    3  在视图中可以遍历 RouteDate.Values,来输出路由匹配产生的路由数据。

    路由数据的获取方法测试如下: 

     特殊 URL 匹配规则

    *匹配:用*来匹配 URL 剩余部分,示例代码如下:

    贪婪匹配规则,示例代码如下:

    路由默认值

    再次强调 defaults 参数的作用,如下示例所示:

    默认值不提供的必须通过 URL 提供,示例如下:

    只提供中间参数的默认值不起作用,如下图:

     

    包含“字面量”时默认值不起作用,如下图:

    路由约束

    (1)路由约束的引出:某 Blog 系统,定义 URL 模式 ,可根据 URL 中的“年月日”数据读取文章?

    (2)分析:定义 URL 模式为{year}/{month}/{day},如何避免无意义的 URL?

    解决方案:使用正则表达式,示例如下: 

     

    通过路由生成 URL

    视图中的链接

    (1)链接的两种方式:纯静态链接:直接指向链接地址,一般不需要改变。动态链接:为了更好的保证 web 项目移植的时候路径的正确。 

    (2)Url.Content()方法的不足:当路由规则变化是,需要修改所有路径。示例如下:

    使用 Action()生成链接 

    (1)Url.Action()方法定义如下: 

    (1)示例:URL 模式为 stumanage/{controller}/{action}/{id}  

    使用 ActionLink()生成链接 

    (1)Html.ActionLink()方法定义如下: 

    (2)示例:URL 模式为 {controller}/{action}/{id} 

     

    分区项目

     分区项目简介

     (1)分区项目的作用:解决 Controller 和 View 太多的问题,能够让系统模块划分更清晰,便于管理

     (2)创建方法:添加-区域 打开添加区域对话框,输入区域名称

     

      

    不同分区项目相同控制器的解决方法 

    (1)主项目和分区项目有相同的控制器,程序运行会出现错误,如下所示: 

    解决方法:分别给分区项目和主项目的路由添加命名空间。示例如下: 

     

    这时候上文说的namespaces就派上用场了.

    将两边的路由都加上 各自的命名空间

    到此,路由的讲解 也就玩了.

  • 相关阅读:
    Action直接访问Servlet API
    Struts2与Struts1的对比
    参入github上的开源项目的步骤
    TortoiseSVN中图标的含义
    eclipse 快捷键
    base(function strchr)
    1
    Java 关于路径
    java初阶
    关于C++中计时的方法
  • 原文地址:https://www.cnblogs.com/silentCM/p/10622232.html
Copyright © 2011-2022 走看看