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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/386355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins 中定时任务构建

一般&#xff0c;在Jenkins中搭建项目完成后&#xff0c;项目可正常运行&#xff0c;基本都会进行定时任务的构建。特别是重要的接口&#xff0c;进行关键接口自动化的日常巡检 时&#xff0c;基本都会设置成定时任务&#xff0c;以方便每天&#xff0c;接口的自动化&#xff0…

爆赞!Jetpack-MVVM-高频提问和解答,满满干货指导

前言 今天我给大家再次分享一下&#xff0c;我最近的一些读书的感想&#xff0c;思考起来&#xff0c;确实能够给自己带来一些真实的帮助和启发&#xff0c;希望大家在平时的工作学习中&#xff0c;也能够认清楚学习的一些本质。 如果我们的学习是在不断掌握应对具体工作场景…

牛笔了!Android面试真题解析火爆全网,面试必备

开头 最近有粉丝反应&#xff0c;不想做安卓了&#xff0c;有朋友转到前端了&#xff0c;安卓不行了&#xff0c;问我怎么办&#xff1f; 自从RN&#xff0c;Weex这种跨平台编程语言出来以后&#xff0c;安卓将死的言论总是不绝于耳。随着颇有摧枯拉朽之势Flutter的出现&…

腾讯,字节等大厂面试真题汇总,深夜思考

前言 最近经常被朋友问到的两个问题。 问题一&#xff1a; “从事IT工作3年了&#xff0c;做技术好累啊&#xff0c;是不是做到30岁就不能继续往下做啊&#xff1f;”问题二&#xff1a; “我已经30岁了&#xff0c;还能不能学编程&#xff1f;” 我给出的答案是&#xff1a…

腾讯,字节等大厂面试真题汇总,进阶学习资料!

前言 找工作还是需要大家不要紧张&#xff0c;有我们干这一行的接触人本来就不多 难免看到面试官会紧张&#xff0c;主要是因为怕面试官问的问题到不上来&#xff0c;那时候不要着急 &#xff0c;答不上了的千万不然胡扯一些&#xff0c;直接就给面试官说这块我还没接触到&…

【题解】鱼塘钓鱼

题目描述 有N个鱼塘排成一排&#xff08;N&#xff1c;100&#xff09;&#xff0c;每个鱼塘中有一定数量的鱼&#xff0c;例如&#xff1a;N5时&#xff0c;如下表&#xff1a; 即&#xff1a;在第1个鱼塘中钓鱼第1分钟内可钓到10条鱼&#xff0c;第2分钟内只能钓到8条鱼&…

腾讯,字节,阿里,小米,京东大厂Offer拿到手软!分享一点面试小经验

&#xff08;一&#xff09;简介 Handler机制是一套Android消息传递机制。在Android开发多线程的应用场景中&#xff0c;将工作线程中需更新UI的操作信息 传递到 UI主线程&#xff0c;从而实现 工作线程对UI的更新处理&#xff0c;最终实现异步消息的处理。 在Android开发中&a…

腾讯,字节,阿里,小米,京东大厂Offer拿到手软!绝对干货

开头 又到年底了&#xff0c;每到这个时候&#xff0c;我们都会慢慢反思&#xff0c;这一年都做了什么&#xff1f;有什么进步&#xff1f;年初的计划都实现了吗&#xff1f;明年年初有跳槽的底气了吗&#xff1f;况且今年的互联网环境太差&#xff0c;需要自己有足够的知识储…

腾讯,字节,阿里,小米,京东大厂Offer拿到手软!讲的明明白白!

缘起 随着Android开发行业逐渐饱和&#xff0c;对Android开发者的面试要求也越来越高&#xff0c;是否掌握底层源码&#xff0c;是面试官衡量一名Android开发者的重要依据。有没有读过源码也可以很大程度上判断你这个人的学习能力和思维方式。无论你开发经验几年&#xff0c;面…

膜拜大佬!5年经验Android程序员面试27天,高级面试题+解析

前言 网上关于启动优化的文章多不胜数&#xff0c;内容千篇一律&#xff0c;大都是列举一些耗时操作&#xff0c;采用异步加载、懒加载等。 而在面试过程中&#xff0c;关于启动优化的问题&#xff0c;如果只是很表面地回答耗时操作应该放在子线程&#xff0c;显然太过于普通…

膜拜大佬!不同层级的Android开发者的不同行为,社招面试心得

都说Android最近行情不好&#xff0c;很多人都遇到瓶颈或放弃或转行。其实这种情况17年18年也是如此&#xff0c;相对比之下&#xff0c;个人认为今年比去年好多了&#xff0c;Android接下来将会走向复苏的春天。 自从Google开始推出AMP项目已经有一年了。除此之外&#xff0c;…

膜拜大牛!Android开发最佳实践手册全网独一份,终获offer

前言 首先介绍一下自己&#xff0c;计算机水本&#xff0c;考研与我无缘。之前在帝都某公司算法部实习&#xff0c;公司算大公司吧&#xff0c;然而个人爱好偏开发&#xff0c;大二的时候写个一个app&#xff0c;主要是用各种框架。 学习路径&#xff1a;如何循序渐进、阶段性…

膜拜大牛!HTTPS面试常问全解析,吊打面试官系列!

写在前面 1月初失业&#xff0c;找了近2个多月的工作了&#xff0c;还没找到心仪的工作&#xff0c;感觉心好慌&#xff0c;不知道该怎么办了&#xff1f;找不到工作的时候压力很大&#xff0c;有人说自信会很受打击&#xff0c;还有人说会很绝望&#xff0c;是人生的低谷………

vSphere HA 原理与配置

内容预览&#xff1a; 1. vSphere HA 概述 2. vSphere HA 提供的保护级别 3. vSphere HA运行原理 4. vSphere HA 故障支持场景 5. vSphere HA接入控制策略 6. 如何选择vSphere HA 的接入控制策略 7. 配置vSphere HA的基础条件 8. 虚拟机组件保护 9. 开启vSphere HA功能 1. v…

自学Android!Android高级工程师面试题-字节跳动,附答案

前言 大厂面试一直都是程序员圈内摸鱼时间津津乐道的话题&#xff0c;进大厂想必也是无数程序员的梦想。 关于“原理”的问题&#xff0c;几乎是现如今Android开发岗必问的问题&#xff0c;尤其在大厂面试中更为突出。有过大厂面试经验的小伙伴应该知道&#xff1a;大厂的面试…

被面试官问的Android问题难倒了,成功入职字节跳动

感悟 这个世界有一个“二八原则”在好多地方都发挥着作用&#xff0c;在Android开发上我认为也一样有用。做一个Android开发&#xff0c;你也许只会用到Android开发知识中的20%&#xff0c;有80%其实你学了也不一定会用。 而面试官也一样&#xff0c;他也可能只掌握了20%的知…

被面试官问的Android问题难倒了,系列篇

本篇将由 环境搭建、实现原理、编程开发、插件开发、编译运行、性能稳定、发展未来 等七个方面&#xff0c;对当前的 React Native 和 Flutter 进行全面的分析对比&#xff0c;希望能给你更有价值的参考。 前言 移动端跨平台在经历数年沉浮之后&#xff0c;如今还能在舞台聚光…

覆盖所有面试知识点,持续更新中

我所接触的Android开发者&#xff0c;百分之九十五以上 都遇到了以下几点致命弱点&#xff01; 如果这些问题也是阻止你升职加薪&#xff0c;跳槽大厂的阻碍。 那么我确信可以帮你突破瓶颈&#xff01; 应届坎坷求职路 一个广州非985/211普通本科生&#xff0c;计算机科学…

覆盖所有面试知识点,赶紧收藏!

前言 近日&#xff0c;字节跳动正式启动了2021届秋季校园招聘&#xff0c;为应届毕业生开放超过6000个工作岗位。这一数字超过了该公司往年秋招规模&#xff0c;并与其今年春招规模持平。全年校招人数共计超过1万2千人&#xff0c;远高于同类型互联网公司&#xff0c;体现了字…

实现技术3次作业 谢筱 1101220759

3次作业 谢筱 1101220759 作业一 要求&#xff1a; &#xff08;1&#xff09; 写一个博客, 列出你发现的微软学术搜索的功能性的缺陷 (bug), 至少一个. 用专业的语言描述 解答&#xff1a; &#xff08;1&#xff09; 缺陷一&#xff1a; 缺少中文关键字搜索功能&#…