在上一篇文章中,有约定路由的介绍。MVC 5中增加了对属性路由这一新技术的支持。在属性路由中,路由是由直接运用于控制器的C#属性定义的。

启动和运用属性路由

默认情况下属性路由是禁止的,通过MapMvcAttributeRoutes扩展方法可以启用它。该方法由RouteCollection对象调用,如下图所示:

        public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}");routes.MapMvcAttributeRoutes();//启动属性路由routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional });}

调用 MapMvcAttributeRoutes 方法导致路由系统检查应用系统中的控制器类,并寻找匹配路由属性。最重要的属性是Route。如下图所示:

    public class CustomerController : Controller{[Route("Test")]// GET: Customerpublic ActionResult Index(){ViewBag.Controller = "Customer";ViewBag.Action = "Index";return View("ActionName");}public ActionResult List(){ViewBag.Controller = "Customer";ViewBag.Action = "List";return View("ActionName");}}

当一个动作方法用Route属性修饰时,它不需要通过约定路由来访问,这意味着Customer控制器中的Index方法不再需要/Customer/Index,也不能用/Customer/Index来访问。 执行效果如下图所示:


使用片段变量创建路由

虽然通过属性表示,但是属性路由支持和基于约定路由一样的特性。这些特性包括创建包含片段变量的路由。如下图所示:

    public class CustomerController : Controller{[Route("Test")]// GET: Customerpublic ActionResult Index(){ViewBag.Controller = "Customer";ViewBag.Action = "Index";return View("ActionName");}[Route("Users/Add/{user}/{id}")]public string Create(string user, int id){return string.Format("User:{0},ID:{1}",user,id);}public ActionResult List(){ViewBag.Controller = "Customer";ViewBag.Action = "List";return View("ActionName");}}

上述代码中添加了一个带有string 和 int 类型参数的动作方法Create。为了简单起见,返回一个string类型的结果,这样就不用创建一个视图了。 用Route属性定义的路由混合了静态前缀(Users/Add)以及方法参数对应的user 和 id 片段。为了调用Create方法,MVC框架使用模型绑定特性将片段变量转化成正确的类型。运行效果如下图所示:


运用路由约束

属性路由中的约束更加直接,如下图所示:

    public class CustomerController : Controller{[Route("Test")]// GET: Customerpublic ActionResult Index(){ViewBag.Controller = "Customer";ViewBag.Action = "Index";return View("ActionName");}[Route("Users/Add/{user}/{id:int}")]public string Create(string user, int id){return string.Format("User:{0},ID:{1}",user,id);}[Route("Users/Add/{user}/{password}")]public string ChangePass(string user, string password){return string.Format("changePass Method - User:{0}, Pass:{1}",user,password);}public ActionResult List(){ViewBag.Controller = "Customer";ViewBag.Action = "List";return View("ActionName");}}

新的动作方法名称为ChangePass,有两个string类型的参数。但是为了区分Create方法,对Create方法中的Route属性运用了约束,[Route("Users/Add/{user}/{id:int}")],指定 id 接收int类型的请求。 运行效果如下图所示:


组合约束

可以将多个约束运用于一个片段,以便进一步限制路由将要匹配的值的范围,如下图所示:

        [Route("Users/Add/{user}/{password:alpha:length(6)}")]public string ChangePass(string user, string password){return string.Format("changePass Method - User:{0}, Pass:{1}",user,password);}

使用Route Prefix

可以使用Route Prefix属性定义一个将被运用到控制器所有路由中的普通前缀,当很多动作都使用同样的根URL为目标是,这点特别有用。如下图所示:

    [RoutePrefix("Users")]public class CustomerController : Controller{[Route("~/Test")]// GET: Customerpublic ActionResult Index(){ViewBag.Controller = "Customer";ViewBag.Action = "Index";return View("ActionName");}[Route("Add/{user}/{id:int}")]public string Create(string user, int id){return string.Format("User:{0},ID:{1}",user,id);}[Route("Add/{user}/{password:alpha:length(6)}")]public string ChangePass(string user, string password){return string.Format("changePass Method - User:{0}, Pass:{1}",user,password);}public ActionResult List(){ViewBag.Controller = "Customer";ViewBag.Action = "List";return View("ActionName");}}

运行效果如下图所示:

以~/为前缀告诉MVC框架,不要运用到Index动作方法的RoutePrefix属性,这意味着它仍然可以通过/Test来访问。

精通ASP.NET MVC ——属性路由相关推荐

  1. 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)

    [索引页] [×××] 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing) 作者:webabcd 介绍 System.Web.Routing - 此命名空间提供 ...

  2. 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(8) 权限管理,自定义权限,扩展权限...

    索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引 简述 今天我们来做权限的管理,这篇比较多 希望新手朋友慢慢消化 项目准备 我们用的工具是:VS 2013 ...

  3. 《精通 ASP.NET MVC 4》----1.3 ASP.NET MVC的关键优点

    本节书摘来自异步社区<精通 ASP.NET MVC 4>一书中的第1章,第1.3节,作者: [美]Adam Freeman ,译者: 李萍 , 徐燕萍 , 林逸 , 更多章节内容可以访问云 ...

  4. 《精通 ASP.NET MVC 3 框架(第三版)》----第2章 准备工作 2.1 准备工作站

    本节书摘来自异步社区<精通 ASP.NET MVC 3 框架(第三版)>一书中的第2章,第1节,作者: [美]Adam Freeman , Steven Standerson,译者: 林逸 ...

  5. 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(7.2) 模块管理,模块的添加、修改、删除...

    索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引 简述 今天我们来做模块管理的 添加.修改.删除 项目准备 我们用的工具是:VS 2013 + SqlSer ...

  6. 《精通 ASP.NET MVC 5》----1.8 本书所需的软件

    本节书摘来自异步社区<精通 ASP.NET MVC 5>一书中的第1章,第1.8节,作者: [美]Adam Freeman(弗瑞曼 A.),译者: 张成彬 , 徐燕萍 , 李萍 , 林逸 ...

  7. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  8. 【无私分享:从入门到精通ASP.NET MVC】从0开始,一起搭框架、做项目(5.5) 登录功能的实现,完善登录功能...

    索引 [无私分享:从入门到精通ASP.NET MVC]从0开始,一起搭框架.做项目 目录索引 简述 今天我们来完善我们的登录功能 项目准备 我们用的工具是:VS 2013 + SqlServer 20 ...

  9. 《精通 ASP.NET MVC 5》----1.5 本书的结构

    本节书摘来自异步社区<精通 ASP.NET MVC 5>一书中的第1章,第1.5节,作者: [美]Adam Freeman(弗瑞曼 A.),译者: 张成彬 , 徐燕萍 , 李萍 , 林逸 ...

最新文章

  1. jqurey操作select 语法解释
  2. 观点 | 云原生时代来袭 下一代云数据库技术将走向何方?
  3. Androidclient与服务端交互之登陆演示样例
  4. Python基本语法,python入门到精通
  5. [置顶] 火车票余票接口API使用方法
  6. spark学习-72-源代码:Endpoint模型介绍(4)-Spark为何使用Netty通信框架替代Akka
  7. 准备入行Web前端,又担心适不适合,怎么办?
  8. 总结之:CentOS 6.5基于DHCP的PXE自动化安装系统详解
  9. ajax请求url最大长度,针对较长的URL的400BAD请求(ajax)
  10. 字符设备与块设备的区别
  11. Shell常用命令cat用法详解
  12. pr导出html,premiere视频导出怎么设置? pr导出高质量视频的教程
  13. 计算机网络实验水晶头,计算机网络 实验1 双绞线水晶头制作.docx
  14. 工程项目成本费用明细表_项目工程成本不会测算?全套Excel自动计算表,可直接套定额...
  15. linux怎样编译安装pidgin,Ubuntu 10.04编译安装Pidgin-2.7.3整个过程
  16. python中的各类除法总结
  17. 51单片机-WIFI模块
  18. 电源系列4:一文学会选择BUCK降压电路电感
  19. 开源流媒体服务器SRS环境搭建
  20. CDS-MVSNet理解

热门文章

  1. 转向Kotlin——数据类和封闭类
  2. 介绍MFSideMenu左右滑动控件的使用
  3. FATAL ERROR: Could not find ./bin/my_print_defaults 解决方法
  4. Java并发同步器AQS(AbstractQueuedSynchronizer)学习笔记(2)
  5. 解决“添加删除程序”里面隐藏问题
  6. python实现链表的删除_Python中 为我们提供了一些独特的解决方案的方法特性
  7. zkServer.cmd 闪退
  8. Tomcat安装与环境变量的配置-Linux+windows
  9. windows版一键绕id工具_Windows免费版一键绕过IOS13.6激活锁工具XgRiNdA,完美重启!...
  10. go 写文件_「go」 项目多个文件编程