• MVC之路由规则 (自定义,约束,debug)


    自定义路由规则的要求,小范围写在前,大范围写在后。

    路由规则可以注册多条,
    路由规则的名称不能重复
    路由规则有顺序,并且按照顺序进行匹配,建议小范围写在前,大范围写在后。
    路由规则可以设置约束 即正则表达式
    路由规则匹配的控制器可以设置命名空间约束

    routes.MapRoute(
    name: "NewShow",
    url: "{year}-{month}-{day}-{id}",
    defaults: new { controller = "News", action = "Show" },
    constraints:new
    {
    year=@"^d{4}$",
    month = @"^d{1,2}$",
    day = @"^d{1,2}$"
    }
    );

    routes.MapRoute(
    // 1.参数name设置路由规则的名称必须是唯一的,重复会报异常默认添加”Default”的路由规则
    name: "Default",
    //2.参数url设置url的路由规则,可变的值使用{}括起来关键字controller、action名称不可变
    url: "{controller}/{action}/{id}",
    //3.参数defaults设置路由规则中参数的默认值类型为object,可以传递一个匿名对象,属性取决于规则中定义的参数参数UrlParameter.Optional表示可选的只读参数如果在实际的url中没有指定路由规则中某些参数,则会使用默认值作为参数的值使用
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    路由中的几个对象:
    1.路由规则Route:可以查看源代码了解一下构造方法,需要指定路由格式,默认值,处理器三个值。代码如下:
    routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    2. 路由数据RouteData:当前请求上下文匹配路由规则而得到的一个对象,可以在Action中通过RouteData.GetRequestString("controller/action")获取本些请求中控制或行为的真实名称

    3.路由集合RouteCollection:存放路由规则的集合Collection<RouteBase>,一个MVC项目中,可以配置多个路由规则,按照键值对的格式存储到路由集合中
    4.路由表RouteTable:类中包含静态的RouteCollection属性,完成所有路由规则的全局存储,在Global中完成注册

    客户的请求过程为:
    当一个客户请求过来时,HttpContext请求到RouteCollection中去RouteTable中的第个键值对的Route比对 如果有一个比对路由规则比对成功,则生成一条RouteData数据进而跳转到对应Cotroller的Action中去进行相应的处理。

    优点:

    能够根据系统需求,灵活的划分请求规则(不同模块请求的 URL 是不一样的)。
    屏蔽物理路径,提高系统的安全性,以上情况是无法根据 URL 分析视图文件在站点目录中的位置。
    有利于搜索引擎优化,可以将 URL 请求统一规范,以后维护中,如果页面发生变化,URL 可以保持不变

     URL 模式的定义:

    占位符:可以是一个字符串或字符,比如“x”、“id”、“year”等。
    字面量:可能是一个比较固定的字符,比较常见的是斜杠“/”;也可以是字符串。

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

    匹配要求:

    1、

    1 字面量:必须严格匹配,即实际请求的 URL 中的字符串和路由模式中的字面量字符串必须完全一致。
    2 大小写:URL 模式匹配是不区分大小写。
    3 常量:没有包含在大括号内的信息被作为一个常量对待;比如上面的 Course,以及在分区项目中路由的定义

    2、

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

    3、

    关于{controller}/{action}
    必不可少:在一个实际的 MVC 系统中, {controller}和{action} 必不可少,如果缺少就会找不到路径而出错。
    约定规则:这个占位符是 MVC 里面约定的,并且会被解析成控制器和对应的方法。
    位置灵活:这两个约定的占位符可以在任意位置。

    4、

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

    routes.MapRoute(
    // 1.参数name设置路由规则的名称必须是唯一的,重复会报异常默认添加”Default”的路由规则
    name: "Default",
    //2.参数url设置url的路由规则,可变的值使用{}括起来关键字controller、action名称不可变
    url: "{controller}/{action}/{id}",
    //3.参数defaults设置路由规则中参数的默认值类型为object,可以传递一个匿名对象,属性取决于规则中定义的参数参数UrlParameter.Optional表示可选的只读参数如果在实际的url中没有指定路由规则中某些参数,则会使用默认值作为参数的值使用
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );路由的调试,在我们开发的 时候可以使用RouteDeugger进行路由的调试,看我们写的路由有没有启作用,用法 如下把RouteDebug.dll添加引用,在Global.asax.cs中注册路由之后 添加 RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);

  • 相关阅读:
    关于listview嵌套listview
    Android ImageView(scaleType属性)
    在服务器端实现数据任意排序算法
    分页拖放排序dragsort
    拖放鼠标实现内容排序
    计算机科学中最重要的32个算法
    cocos2d-x 获取SD卡图片 线程 UI
    cocos2d-x 静态变量 static
    cocos2d-x 启动触摸事件
    cocos2d-x android混编时图片不显示
  • 原文地址:https://www.cnblogs.com/ypyp123/p/12770391.html
Copyright © 2020-2023  润新知