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,一经查实,立即删除!

相关文章

爆赞!Android岗大厂面试官常问的那些问题,论程序员成长的正确姿势

开头 昨天去面了一家公司&#xff0c;价值观有受到冲击。 面试官技术方面没的说&#xff0c;他可能是个完美主义的人&#xff0c;无论什么事情到了他那里好像都有解决的方案&#xff0c;我被说的无所适从&#xff0c;感觉他很厉害。 但我不能认可的是&#xff0c;面试官觉得…

Jenkins 中定时任务构建

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

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

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

多线程控制不同的线程取不同的数据的问题

做项目的时候需要分析数据&#xff0c;数据量比较大用到多线程&#xff0c;刚开始接触线程&#xff0c;想着线程应该平分数据&#xff0c;不应该取重复数据&#xff0c;采用了比较笨的方法&#xff0c;将数据的count取出&#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;这里就对线性回归的原理和算法做一个小结。 一、线性回归的模型函数和损失函数 线性回归遇到的问题一般是这样的。我们有m个样本&#xff0c;每个样本对应于n维特征和一个结果输出&#xff0c;如下&#xff1a; \((x_…

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

前言 找工作还是需要大家不要紧张&#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;需要自己有足够的知识储…

request对象与response对象

一.request对象 1.通过request对象可以获得客户端输入的信息。request对象包含了从客户端传来的请求信息。 请求的参数是一个请求的组成部分&#xff0c;它们被作为字符串从客户端传送到JSP/Servlet容器中&#xff0c;并被用于初始化request对象。 2.request对象是javax.Servle…

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

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

HTML div 滚动条样式设计

::-webkit-scrollbar-track-piece{ background-color:#fff;/*滚动条的背景颜色*/ -webkit-border-radius:0;/*滚动条的圆角宽度*/ } ::-webkit-scrollbar{ width:8px;/*滚动条的宽度*/ height:8px;/*滚动条的高度*/ } ::-webkit-scrollbar-thumb:vertical{/*垂直滚动条的样式*/…

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

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

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

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

zookeeper的四种类型的节点

znode创建类型(CreateMode),有以下四种&#xff1a; PERSISTENT 持久化节点PERSISTENT_SEQUENTIAL 顺序自动编号持久化节点&#xff0c;这种节点会根据当前已存在的节点数自动加 1EPHEMERAL 临时节点&#xff0c; 客户端session超时这类节点…

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

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

英语每日一句

从今天开始学英语了&#xff1a;还蛮重要的。 It s not what I ask for.这不是我要的那样。 你能写出&#xff0c;你第一时间想到的一句英语吗&#xff1f; 转载于:https://www.cnblogs.com/igouz/archive/2008/11/28/1343014.html

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

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