源栈培训:ASP.NET-X:Route机制

更多
2019年07月21日 10点10分 作者:叶飞 修改
网址:/Blog/Single?id=1 太丑陋,能不能换成:/Blog/Single/1,或者/Blog/1?

只需要在startup.cs中修改:

            services.AddMvc()
                .AddRazorPagesOptions(
                    opt => {
                        opt.Conventions.AddPageRoute("/Blog/Single", "/Blog/Single/{id}");
                        opt.Conventions.AddPageRoute("/Blog/Single", "/Blog/{id}");
                    }
                )
                .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

就能实现,这是为什么呢?


Route机制

ASP.NET使用route来匹配URL和Handler(处理器,RazorPage中就是Page):

  • 从URL中获取信息,将请求导向相应的Page,以及
  • 根据route信息,反向生成相应的URL

底层实现:

  • 维护着一个route集合,
  • 在集合中迭代查找匹配信息


默认Route

  • 文件夹Pages                                                     =>    URL的根目录:/ (注意:不要忘记这个“/”,否则会被认为是相对路径)
  • Pages下子文件夹(如:Pages\Blog)               =>    URL中的子目录:/Blog
  • .cshtml文件(如:Pages\Blog\Single.cshtml)   =>    去除.cshtml后缀做为最后一级的子目录:/Blog/Single

注意:

  • Index.cshtml 可以省略
  • Shared文件夹:首先搜索普通文件夹,然后Shared文件夹

  • 需要@page标记,而且必须放置在第一行,表明这个.cshtml文件是一个RazorPage项目中的page,才能够作为route的handler

placeholder

defaults:new{ category ="all"}

constraints:new{ id =@"\d+"}

{controller}

{action}

Optional


@page指令

还可以指定:

  • 自定义路径:让当前的Page路径被解析成其他URL
  • 在默认路由后“追加”一个route segment
    @page "{pager?}"   @*?表示可选*@
    @page "{pager:int?}"   @*int表示数据类型约束*@
    <span>Request.Query["pager"]:</span> @Request.Query["pager"]  <br />
    <span>PageContext.RouteData.Values["pager"]:</span> @PageContext.RouteData.Values["pager"]
    
    注意:
    1. route中不能使用以下关键字:action/area/controller/handler/page
    2. 路由约束除int以外,还有很多很多,建议尽可能多的使用路由约束,以减少路由冲突
    3. Query是从URL中取,而RouteData是从Route中取。在PageModel中,如果在属性上使用[BindProperty],都能正常获取,是因为BindProperty会自动从QueryString和RouteData中取值绑定。


AddRazorPagesOptions

最常用最灵活的方式,如开篇所示。

AddPageRoute()方法的:

  • 第一个参数是Page的默认的route(pageName),
  • 第二个参数代表自定义的route格式,其route data书写格式(如:{id:int?})和前面讲的@page指示相同,但更加的灵活

然而,飞哥建议:尽可能少的使用自定义的route,因为这会增加系统的复杂性,到最后有可能无法收场……

                        opt.Conventions.AddPageRoute("/Blog/Index", "/Blog/Paged/{id}");
                        opt.Conventions.AddPageRoute("/Blog/Category", "/Blog/{category}/{id:int?}");

(演示:route匹配的依据,略)


Route相关的Tag Heper

<a asp-page="/Blog/Index" asp-route-id="8" asp-route-paged="Paged"></a>

能匹配,就生成route格式的url

不能匹配的route data,使用query string处理

个人觉得,没啥卵用,^_^


作业

使用route匹配一下url格式:

  • 文章单页:/Article/Single?id=1 => /Article/1
  • 文章修改:/Article/Edit?id=7 => /Article/Edit/7
  • 所有文章列表:/Article/Index?pageIndex=3 => /Article/Page-3
  • 文章分类列表:/Article/IndexOfCategory?pageIndex=3&category=1 => /Article/Category-1/Page-3
  • 博主文章列表:/Article/IndexOfAuthor?author=5&pageIndex=2 => /Article/User-5/Page-2
  • 任务历史月记录:/Task/HistoryOfMonth?year=2019&month=8&id=5 => /Task/History/5/2019/8





源栈培训 ASP.NET route
赞: 20 踩: 2

打赏
已收到打赏的 帮帮币

你的 打赏 非常重要!
为了保证文章的质量,每一篇文章的发布,都已经消耗了作者 1 枚 帮帮币
没有“帮帮币”,作者无法发布新的文章。

全系列阅读
评论 / 1
2019年08月02日 18点54分 --- 第 1 楼 --- 28zhu

精选
看来要从头看啊,这从半截开始看,总感觉没有前戏
叶飞的系列文章

源栈培训:ASP.NET全栈开发

飞哥的源栈培训:线上全程直播,免费收看;线下拎包入住,按周计费。本系列收录所有讲义(含视频录播地址)

编程那些事:菜鸟入门

大飞哥倾力之作,面向有意入行IT/开发/编程的初学者,欢迎任何形式的留言建议……

从包工头到程序猿

真实故事,讲述我在家装公司关门之后,如何转行成为一个程序猿的故事。(《折腾》第三卷)

《折腾》(卷一)青涩

时间段:从大学毕业到开始创业。离开青葱校园,涉世之初的那些往事……

《折腾》(卷二)风雨 之(1)工地

我一个完全的门外汉(无论装修还是管理),开始给黎叔装修房子。从踌躅满志,到四处碰壁;从一往直前,到左右为难……

《折腾》(卷二)风雨 之(2)胸怀

作为一个律师,接工程没签合同,被狠狠的坑了一把!年轻人暴烈的想要复仇,黎叔教他一个企业家的胸怀……

《折腾》(卷二)风雨 之(3)渠道

成立了公司,招聘了员工,开始大力的拓展业务,一个接一个的坑,摔倒了又爬起来……

《折腾》(卷二)风雨 之(4)视野

经历残酷现实的磨砺,终于明白:干啥事,都不能闭门造车,人要走出去,开阔视野……

未分类

系统自动生成的未分类系列

一锅大杂烩

从律师到包工头,从码农到写手,读书交友生活创业,各种零零碎碎,乱七八糟……

人人都是程序猿

计算机编程普及课程,视频:https://space.bilibili.com/55410301/#/channel/detail?cid=49491

全部
关键字



帮助

反馈