一.URL 生成

  接着上篇讲MVC的路由,MVC 应用程序可以使用路由的 URL 生成功能,生成指向操作的 URL 链接。 生成 URL 可消除硬编码 URL,使代码更稳定、更易维护。 此部分重点介绍 MVC 提供的 URL 生成功能,并且仅涵盖 URL 生成工作原理的基础知识。 IUrlHelper 接口用于生成 URL,是 MVC 与路由之间的基础结构的基础部分。 在控制器、视图和视图组件中,可通过 Url 属性找到 IUrlHelper 的实例。

        //// mvc 框架的ControllerBase类下//摘要://     Gets or sets the Microsoft.AspNetCore.Mvc.IUrlHelper.public IUrlHelper Url { get; set; }

  

  1.1 传统路由下的url生成

    下面示例中,通过使用IUrlHelper接口在index页面生成指向另一操作Destination的 URL超连接。

        [Route("Home/Index")]public IActionResult Index(){// Generates /Home/Destinationvar url = Url.Action("Destination");var urlAddress = "<a href=\"" + url + "\"  >Click on to the Destination</a>";ViewData["url"] = urlAddress;return View();}public IActionResult Destination(){return View();}// Index.cshtml     @Html.Raw(ViewData["url"].ToString())

    当加载index页面后,点击超连接"Click on to the Destination" 将进入后台控制器的Destination操作中。

    上面的 Url.Action 示例假定使用传统路由,但 URL 生成功能的工作方式与属性路由相似,只不过概念不同。 在传统路由中,路由值用于扩展模板。controller 和 action 的路由值通常出现在该模板中, 这种做法可行是因为通过路由匹配的 URL 遵守某项约定。 这里的扩展模板指的是routes.MapRoute来添加路由规则约定。

  1.2 属性路由下的url生成

    在属性路由中,controller 和 action 的路由值不能出现在模板中(也就是不会使用routes.MapRoute),它们用于查找要使用的模板。

      //首先不用传统路由,去掉了routes.MapRoutepublic void Configure(IApplicationBuilder app){app.UseMvc();}[Route("")]public IActionResult Index(){// Generates /custom/url/to/destination var url = Url.Action("Destination");var urlAddress = "<a href=\"" + url + "\"  >"+url+"</a>";ViewData["url"] = urlAddress;return View();}[HttpGet("custom/url/to/destination")]public IActionResult Destination(){return View();}

     生成如下图所示 :所以会生成与httpget配置的路径一样,是因为属性路由下的url生成,它们用于查找要使用的模板。MVC 生成一个包含所有属性路由操作的查找表,并匹配 controller 和 action 的值,以选择要用于生成 URL 的路由模板。

  1.3 根据action名称生成 URL

    Url.Action (IUrlHelper . Action) 以及所有相关重载都基于这样一种想法:用户想通过指定控制器名称和操作名称来指定要链接的内容。

        [Route("")]public IActionResult Index(){// Generates /Home/Destination/1?color=redvar url = Url.Action("Destination","Home",new  { id=1 , color="red"});var urlAddress = "<a href=\"" + url + "\"  >" + url + "</a>";ViewData["url"] = urlAddress;return View();}public IActionResult Destination(int id,string color){return View();}    

  1.4 根据路由名称生成 URL

    IUrlHelper 还提供 Url.RouteUrl 系列的方法。 这些方法类似于 Url.Action。Url.RouteUrl 指定一个路由名称,以使用特定路由来生成 URL,通常不指定控制器或操作名称。

        [Route("")]public IActionResult Index(){// Generates /custom/url/to/destinationvar url = Url.RouteUrl("Destination_Route");var urlAddress = "<a href=\"" + url + "\"  >Click on to the Destination</a>";ViewData["url"] = urlAddress;return View();}[HttpGet("custom/url/to/destination", Name = "Destination_Route")]public IActionResult Destination(){return View();}

  1.5  其它生成

    (1)在 HTML 中生成 URL: IHtmlHelper 提供 HtmlHelper 方法 Html.BeginForm 和 Html.ActionLink,可分别生成 <form> 和 <a>元素。 这些方法使用 Url.Action 方法来生成 URL,并且采用相似的参数。

    (2)在action中重定向:RedirectToAction("Index");

二. area区域路由

    区域是一种 MVC 功能,用于将相关功能整理到一个组中,作为单独的路由命名空间(用于控制器操作)和文件夹结构(用于视图)。 通过使用区域,应用程序可以有多个名称相同的控制器,只要它们具有不同的区域。 通过向 controller 和 action 添加另一个路由参数 area,可使用区域为路由创建层次结构。

    下面是mvc文件结构,对于users控制器,在视图层多了一级Manage文件夹。如何使users控制器中AddUser操作关联AddUser.cshtml呢,下面使用区域路由来实现:

          app.UseMvc(routes =>{//用于名为 Blog 的区域routes.MapAreaRoute("blog_route", "Blog","Manage/{controller}/{action}/{id?}");/** 注释的MapRoute与上面的区域路由作用一样routes.MapRoute("blog_route", "Manage/{controller}/{action}/{id?}",defaults: new { area = "Blog" }, constraints: new { area = "Blog" });*/routes.MapRoute(name: "default",template: "{controller=Home}/{action=Index}/{id?}");});

        //控制器上应用区域路由       [Area("Blog")] public class UsersController : Controller{// GET: /<controller>/public IActionResult AddUser(){return View();}}

    在浏览器中输入/Manage/Users/AddUser 将自动进入AddUser()中,这是因为当前路由:Manage/{controller}/{action}/{id?}符合blog模板,所以使用Blog区域路由。

  

三. IActionConstraint 路由约束

    实现IActionConstraint最简单的方法是创建派生自 System.Attribute 的类,并将其置于操作和控制器上。MVC 将自动发现任何应用属性IActionConstraint的操作和控制器。

    在下面的示例中,约束基于路由数据中的国家/地区代码选择操作,开发人员负责实现Accept 方法,当路由中id值为en-US时Accept 方法返回 true 以表示该操作是匹配项,一切按正常解析返回客户端。 如果Accept 方法返回false将不执行IActionConstraint标记的action,向客户端返回404错误。

//定义ActionConstraint属性约束
public class CountrySpecificAttribute : Attribute, IActionConstraint{private readonly string _countryCode;public CountrySpecificAttribute(string countryCode){_countryCode = countryCode;}public int Order{get{return 0;}}public bool Accept(ActionConstraintContext context){return string.Equals(context.RouteContext.RouteData.Values["id"].ToString(),_countryCode,StringComparison.OrdinalIgnoreCase);}}

      //应用路由的action约束,并且路由中id值为en-US[CountrySpecific("en-US")]public IActionResult Privacy(string countryCode){return View();}

    在浏览器测试时:如果输入http://localhost:30081/home/Privacy/zh-cn,则网页显示404。如果输入http://localhost:30081/home/Privacy/en-US 则符合约束,网页显示正常。

 

  参考文献

  官方资料:asp.net core routing

转载于:https://www.cnblogs.com/owenzh/p/11212514.html

asp.net core 系列 6 MVC框架路由(下)相关推荐

  1. asp.net core系列 40 Web 应用MVC 介绍与详细示例

    一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...

  2. ASP.Net Core 2.2 MVC入门到基本使用系列 (四)

    本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...

  3. ASP.NET CORE系列【一】搭建ASP.NET CORE项目

    原文:ASP.NET CORE系列[一]搭建ASP.NET CORE项目 为什么要使用 ASP.NET Core? NET Core 刚发布的时候根据介绍就有点心里痒痒,微软的尿性都懂的,新东西bug ...

  4. asp.net core系列 38 WebAPI 返回类型与响应格式--必备

    一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...

  5. asp.net core 3.x Endpoint终结点路由1-基本介绍和使用

    前言 我是从.net 4.5直接跳到.net core 3.x的,感觉asp.net这套东西最初是从4.5中的owin形成的. 目前官方文档重点是讲路由,没有特别说明与传统路由的区别,本篇主要介绍终结 ...

  6. 在 ASP.NET Core 中安装 MVC

    目录 本文出自<从零开始学 ASP.NET CORE MVC>目录  视频课程效果更佳:从零开始学 Asp.Net Core MVC 在ASP.NET Core 中安装 MVC 在本视频中 ...

  7. 处理ASP.NET Core中的HTML5客户端路由回退

    在使用由Angular,React,Vue等应用程序框架构建的客户端应用程序时,您总是会处理HTML5客户端路由,它将完全在浏览器中处理到页面和组件的客户端路由.几乎完全在浏览器中... HTML5客 ...

  8. .ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...

    0.前言 在之前的几篇中,我们大概介绍了如何创建一个http://asp.net core mvc项目以及http请求如何被路由转交给对应的执行单元.这一篇我们将介绍一下控制器与视图直接的关系. 1. ...

  9. asp.net core系列 67 Web压力测试工具WCAT

    asp.net core系列 67 Web压力测试工具WCAT 原文:asp.net core系列 67 Web压力测试工具WCAT 一.介绍 最近搭建了一套CQRS框架,需要在投入开发前,进行必要的 ...

最新文章

  1. Transform(CTM,Translate,Rotate,Scale)
  2. 时雨月五| AI机器学习实战の电磁导航智能车中神经网络应用的问题与思考
  3. 使用训练数据结构代替注意力机制
  4. Java基础 JSP九大内置对象
  5. Java黑皮书课后题第4章:*4.3(几何:估算面积)应用4.1节图中以下地点的GPS位置:Georgia州的Atlanta……计算被这四个城市所围起来的区域面积
  6. LeetCode 784. 字母大小写全排列(位运算回溯)
  7. 潘多拉固件设置ipv6_(转)pandorabox固件+PPPOE拨号+IPV6
  8. 五个实用又有趣的网站
  9. QString、QByteArray 相互转换、和16进制与asc2转换
  10. java 判断是否为英文字母_java判断是否是26个英文字母代码示例
  11. Target host is not specified解决方案
  12. 第二章 03 藤蔓生长
  13. 自媒体人写稿必备的工具
  14. bottom sheets_使用Sheetson建立由Google Sheets支持的免费电子邮件列表
  15. 程序员如何应对年龄这样的职场瓶颈?
  16. 第三方开源库:轮播图:Banner/Kanner
  17. 【路径规划】基于matlab蚁群算法栅格地图路径规划及避障【含Matlab源码 2088期】
  18. 从mpeg ts文件中提取I帧(3):pes包的解析
  19. PYQT5(13)-基本窗口控件-拖曳与剪贴板
  20. JavaSE Set HashSet LinkedHashSet TreeSet 集合练习

热门文章

  1. java string对象创建对象_Java String 创建了几个对象
  2. python字典的值可以是字典吗_python字典的值可以是字典吗
  3. Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...
  4. 西瓜大战java_Java中的线程及(简单飞机大战)实现
  5. java url帮助类_Spring居然还提供了这么好用的URL工具类
  6. woocommerce 分类到菜单_Woocommerce商店显示分类
  7. 转载|网络编程中阻塞式函数的底层逻辑
  8. C++网络编程快速入门(三):阻塞与非阻塞式调用网络通信函数
  9. Postgresql中的hybrid hash join(无状态机讲解)
  10. stl向量_用户定义大小的C ++ STL中的2D向量