• ASP.NET MVC路由详解


    1.什么是路由

    一种URL(统一资源定位符)的体现方式,将URL映射到方法的调用。

    在 Web Form 应用,每个 URL 必须匹配一个 .aspx 物理文件,如:http://domain/bar.aspx 必须有一个用于响应渲染的文件 bar.aspx。ASP.Net MVC 则通过引入 Routing 来消除必须使用物理文件映射 URL 的弊端。路由使我们能够定义映射到请求处理程序的 URL 模式。请求处理程序在 WebForm 中是 .aspx 文件,在 MVC 中是 Controller 以及 Action 方法。例如:http://domain/foo

    注:路由并非mvc专属,它是建立在.NET Framework上的一个组件。

    2.使用路由的优势

    ①根据系统需求,灵活的划分请求规则

    ②防止注入式攻击,提高安全性。传统URL和磁盘上的文件一一对应,通过URL就能确定站点目录,而路由把请求映射到控制器。

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

    3.如何定义路由

    新建一个空的ASP.NET MVC项目,目录如下:

    双击打开Global.asax,如下:

    注:Application_start()是程序入口方法,只在打开网站时执行一次。

    RouteConfig.cs文件位于App_Start文件夹中,如下:

    路由模板指的是:域名+端口号之后的内容。

    MVC工作过程:

    一、URL模式

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

    占位符:字符或字符串,如“x”、“id”、“year”等。

    字面量:字符或字符串,最常见的是“/”。

    注:不能以“/”或“~”开头,不能包含“?”,占位符不能连续。

    URL模式示例总结:

    匹配要求:

    1.字面量必须完全一致。

    2.不区分大小写。

    3.没有包含在大括号内的信息作为常量看待,如上面的Course。

    定义多个URL模式的路由:

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

    UrlPrameter.Optional的作用是作为id的默认值,并可以让“/Home/Index”或“/Home”能正常匹配。

    关于占位符:

    示例:https://www.cnblogs.com/1016391912pm/p/12088733.html

    {controller}和{action}是必不可少的,controller代表控制器(示例中的Test),action代表方法(示例中的Index),如果没有定义的话就会因找不到路径而出错。

    像{aa}/{bb}/{cc}这种占位符只是起到占位作用,系统不会将其解析为控制器或方法。

    路由数据的存储和映射

    在ASP.NET MVC中,路由数据存储在RouteData中,方式为键值对,和字典相似。

    路由数据:RouteDate.Values 是RouteValueDictionary类型。RouteData定义为视图和控制器基类的属性。

    可以在视图中遍历RouteData.Values,如下:

    输出:

    *匹配

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

    路由约束

    constraints代表约束:

    二、特性路由

    1.简单的特性路由

    在RegisterRoutes方法中添加:

    routes.MapMvcAttributeRoutes();

    在控制器类中的方法上添加特性:

    我们在浏览器中就可以通过地址http://localhost:46198/haha来运行这个方法,并指向视图中的Index.cshtml

    可以设置多个特性,则可以通过每一个特性名来访问。

    2.使用占位符

    可以通过http://localhost:46198/hello/1来访问Second方法

    3.为每一个方法设置路由

    有时一个控制器中的路由遵循相似的路由模板,可以这样设置:

    这样控制器类中的方法都可以通过home/方法名来访问。(可以在方法名上重新设置,覆盖这种方式)

    4.路由约束

    对于[Route("home/{id}")],我们希望的是id是int类型的,则可以这样设置:[Route("home/{id:int}")]

    一些内联约束:

    5.路由默认值

    [Route("home/{action=Index}")]

  • 相关阅读:
    css设置兼容的透明样式
    mybatis 使用oracle merge into 语句踩坑实录
    eclipse导入SVN上的Maven多模块项目
    jquery.form插件中动态修改表单数据
    java的几种对象(po,dto,dao等)
    redis面试总结
    前段面试准备
    查询各科成绩最好的学生
    Github访问慢解决办法
    该文件有程序在使用
  • 原文地址:https://www.cnblogs.com/1016391912pm/p/12735571.html
Copyright © 2020-2023  润新知