asp.net core 系列 6 MVC框架路由(下)
一.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框架路由(下)相关推荐
- asp.net core系列 40 Web 应用MVC 介绍与详细示例
一. MVC介绍 MVC架构模式有助于实现关注点分离.视图和控制器均依赖于模型. 但是,模型既不依赖于视图,也不依赖于控制器. 这是分离的一个关键优势. 这种分离允许模型独立于可视化展示进行构建和测试 ...
- ASP.Net Core 2.2 MVC入门到基本使用系列 (四)
本教程会对基本的.Net Core 进行一个大概的且不会太深入的讲解, 在您看完本系列之后, 能基本甚至熟练的使用.Net Core进行Web开发, 感受到.Net Core的魅力. 本教程知识点大体 ...
- ASP.NET CORE系列【一】搭建ASP.NET CORE项目
原文:ASP.NET CORE系列[一]搭建ASP.NET CORE项目 为什么要使用 ASP.NET Core? NET Core 刚发布的时候根据介绍就有点心里痒痒,微软的尿性都懂的,新东西bug ...
- asp.net core系列 38 WebAPI 返回类型与响应格式--必备
一.返回类型 ASP.NET Core 提供以下 Web API Action方法返回类型选项,以及说明每种返回类型的最佳适用情况: (1) 固定类型 (2) IActionResult (3) Ac ...
- asp.net core 3.x Endpoint终结点路由1-基本介绍和使用
前言 我是从.net 4.5直接跳到.net core 3.x的,感觉asp.net这套东西最初是从4.5中的owin形成的. 目前官方文档重点是讲路由,没有特别说明与传统路由的区别,本篇主要介绍终结 ...
- 在 ASP.NET Core 中安装 MVC
目录 本文出自<从零开始学 ASP.NET CORE MVC>目录 视频课程效果更佳:从零开始学 Asp.Net Core MVC 在ASP.NET Core 中安装 MVC 在本视频中 ...
- 处理ASP.NET Core中的HTML5客户端路由回退
在使用由Angular,React,Vue等应用程序框架构建的客户端应用程序时,您总是会处理HTML5客户端路由,它将完全在浏览器中处理到页面和组件的客户端路由.几乎完全在浏览器中... HTML5客 ...
- .ne中的控制器循环出来的数据如何显示在视图上_【asp.net core 系列】3 视图以及视图与控制器...
0.前言 在之前的几篇中,我们大概介绍了如何创建一个http://asp.net core mvc项目以及http请求如何被路由转交给对应的执行单元.这一篇我们将介绍一下控制器与视图直接的关系. 1. ...
- asp.net core系列 67 Web压力测试工具WCAT
asp.net core系列 67 Web压力测试工具WCAT 原文:asp.net core系列 67 Web压力测试工具WCAT 一.介绍 最近搭建了一套CQRS框架,需要在投入开发前,进行必要的 ...
最新文章
- Transform(CTM,Translate,Rotate,Scale)
- 时雨月五| AI机器学习实战の电磁导航智能车中神经网络应用的问题与思考
- 使用训练数据结构代替注意力机制
- Java基础 JSP九大内置对象
- Java黑皮书课后题第4章:*4.3(几何:估算面积)应用4.1节图中以下地点的GPS位置:Georgia州的Atlanta……计算被这四个城市所围起来的区域面积
- LeetCode 784. 字母大小写全排列(位运算回溯)
- 潘多拉固件设置ipv6_(转)pandorabox固件+PPPOE拨号+IPV6
- 五个实用又有趣的网站
- QString、QByteArray 相互转换、和16进制与asc2转换
- java 判断是否为英文字母_java判断是否是26个英文字母代码示例
- Target host is not specified解决方案
- 第二章 03 藤蔓生长
- 自媒体人写稿必备的工具
- bottom sheets_使用Sheetson建立由Google Sheets支持的免费电子邮件列表
- 程序员如何应对年龄这样的职场瓶颈?
- 第三方开源库:轮播图:Banner/Kanner
- 【路径规划】基于matlab蚁群算法栅格地图路径规划及避障【含Matlab源码 2088期】
- 从mpeg ts文件中提取I帧(3):pes包的解析
- PYQT5(13)-基本窗口控件-拖曳与剪贴板
- JavaSE Set HashSet LinkedHashSet TreeSet 集合练习
热门文章
- java string对象创建对象_Java String 创建了几个对象
- python字典的值可以是字典吗_python字典的值可以是字典吗
- Java如何避免重量级锁,Java 中锁是如何一步步膨胀的(偏向锁、轻量级锁、重量级锁)...
- 西瓜大战java_Java中的线程及(简单飞机大战)实现
- java url帮助类_Spring居然还提供了这么好用的URL工具类
- woocommerce 分类到菜单_Woocommerce商店显示分类
- 转载|网络编程中阻塞式函数的底层逻辑
- C++网络编程快速入门(三):阻塞与非阻塞式调用网络通信函数
- Postgresql中的hybrid hash join(无状态机讲解)
- stl向量_用户定义大小的C ++ STL中的2D向量