• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 解读ASP.NET 5 & MVC6系列教程(11):Routing路由

解读ASP.NET 5 & MVC6系列教程(11):Routing路由

作者:汤姆大叔 字体:[增加 减小] 来源:互联网 时间:2017-05-11

汤姆大叔通过本文主要向大家介绍了精通asp.net mvc 5,html5 asp.net,pro asp.net mvc 5,asp net mvc 5,asp net培训等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

新版Routing功能介绍

在ASP.NET 5和MVC6中,Routing功能被全部重写了,虽然用法有些类似,但和之前的Routing原理完全不太一样了,该Routing框架不仅可以支持MVC和Web API,还支持一般的ASP.NET5程序。新版的改变有如下几个部分。

首先,Routing系统是基于ASP.NET 5的,是一个独立于MVC的路由框架,而不是基于MVC的。MVC只是在上面扩展了一个快捷方式而已。

其次,在ASP.NET 5中,MVC和Web API控制器没有区别了,即合二为一了。两者派生于同一个Controller基类。也就是说该Routing框架是适用于两者的,适用于MVC则意味着也适用于Web API。

最后,不管在基于约定的Route声明还是基于Attribute的Route声明,都可以使用内联约束和参数选项。例如,你可以约定路由中某个参数的数据类型,也可以让一个参数标记为可选类型,再或者给其提供一个默认值。

Routing框架的主要流程

基本的Routing框架是基于Middleware来实现的,这样就可以将其添加到HTTP的请求Pipeline中了,它可以喝其它任意Middleware一起进行组合使用,如静态文件处理程序、错误页、或者SignalR服务器。

在使用Routing框架之前,首要要了解Routing的作用,作用很简单:

对于HTTP请求,Routing系统负责找出与之匹配的route,创建route数据,并将该请求派送到该route对于的处理程序(Handler)上。Controller和Action的选择,只是MVC的Handler的一个具体实现,该实现使用route数据和HTTP请求中的其它信息来选择要执行的Controller和Action。在新版的MVC6中,该处理程序的名称为MvcRouteHandler。

路由系统的执行流程如下:

ASP.NET 5监听到一个HTTP请求。然后Routing Middleware就会尝试将route集合中的route匹配该请求。一旦成功匹配一个请求,就找出该route对应的handler。调用该handler上的RouteAsync方法(因为所有的handler都要实现该接口方法)。RoutingContext有一个IsHandled标记,如果该标记设置为true,则意味着该请求已经被这个handler成功处理了;如果设置为false,则意味着该handler无法处理该请求,系统会再为此匹配一个route。

和之前的Routing系统有点不同的是,老版的Routing系统一旦成功匹配一个路由,就将其交由其对应的Handler,不管对应的Handler能不能处理该请求,所以就会出现route匹配成功了,但是找不到对应的action,此时就会出现404错误,而新版对此作出了上述第4步骤的改进(重新将控制权交回给Routing系统,进行重新匹配),看起来还是非常不错的。

Route参数和约束条件的改进

在之前的route设置中,要约束一个参数的数据类型的话,我们需要使用类型如下代码:

routes.MapRoute(
 "Product", 
 "Product/{productId}", 
 defaults: new { controller = "Product", action = "Details" },
 constraints: new { productId = @"\d+" });
</div>

而在新版route中,就可以直接设置Product/{productId:int}了,约束条件遵守如下约定:

{parameter:constraint}

目前支持的约束如下:

约束 示例 说明
required "Product/{ProductName:required}" 参数必选
alpha "Product/{ProductName:alpha}" 匹配字母,大小写不限
int "Product/{ProductId:int}" 匹配int类型
long "Product/{ProductId:long}" 匹配long类型
bool "Product/{ProductId:bool}" 匹配bool类型
double "Product/{ProductId:double}" 匹配double类型
float "Product/{ProductId:float}" 匹配float类型
guid "Product/{ProductId:guid}" 匹配guid类型
decimal "Product/{ProductId:decimal}" 匹配decimal类型
datetime "Search/{datetime:datetime}" 匹配datetime类型
composite "Product/{ProductId:composite}" 匹配composite类型
length "Product/{ProductName:length(5)}" 长度必须是5个字符
length "Product/{ProductName:length(5, 10)}" 长度在5-10个之间
maxlength "Product/{productId:maxlength(10)}" 最大长度为10
minlength "Product/{productId:minlength(3)}" 最小长度为3
min "Product/{ProductID:min(3)}" 大于等于3
max "Product/{ProductID:max(10)}" 小于等于10
range "Product/{ProductID:range(5, 10)}" 对应的数组在5-10之间
Regex "Product/{productId:regex(^\d{4}$)}" 符合指定的正则表达式

而对于可选参数,则值需要在约束类型后面加一个问号即可,示例如下:

routes.MapRoute(
 "Product", 
 "Product/{productId:long?}", 
 new { controller = "Product", action = "Details" });
</div>

如果参数是必填的,需要保留一个默认值的话,则可以按照如下示例进行设置:

routes.MapRoute(
 "Product", 
 "Product/{productId:long=1000}",
 new { controller = "Product", action = "Details" });
</div>

通用Routing

关于示例使用,我们先不从MVC开始,而是先从普通的Routing使用方式开始,新版route添加的时候默认添加的是TemplateRoute实例,并且在该实例实例化的时候要设置一个Handler。

举例来说,我们先创建一个空的ASP.NET 5项目,并在project.json文件的dependencies节点中添加程序集"Microsoft.AspNet.Routing": "1.0.0-beta3",,在Startup.cs的Configure方法里添加如下代码:

public void Configure(IApplicationBuilder app)
{
 RouteCollection routes = new RouteCollection();
 routes.Add(new TemplateRoute(new DebuggerRouteHandler("RouteHandlerA"), "", null));
 routes.Add(new TemplateRoute(new DebuggerRouteHandler("RouteHandlerB"), "test/{a}/{b:int}", null));
 routes.Add(new TemplateRoute(new DebuggerRouteHandler("RouteHandlerC"), "test2", null));

 app.UseRouter(routes); // 开启Routing功能
}
</div>

在这里,我们设置HTTP请求处理的的Handler为DebuggerRouteHandler,该类继承于IRouter,实例代码如下:

public class DebuggerRouteHandler : IRouter
{
 private string _name;

 public DebuggerRouteHandler(string name)
 {
 _name = name;
 }

 public string GetVirtualPath(VirtualPathContext context)
 {
 throw new NotImplementedException();
 }

 public async Task RouteAsync(RouteContext context)
 {
 var routeValues = string.Join("", context.RouteData.Values);
 var message = String.Format("{0} Values={1} ", _name, routeValues);
 await context.HttpContext.Response.WriteAsync(message);
 context.IsHandled = true;
 }
}
</div>

上述类,继承IRouter以后,必须实现一个RouteAsync的方法,并且如果处理成功,则将IsHandled设置为true。

访问如下网址即可查看相应的结果:

正常:`http://localhost:5000/`
正常:`http://localhost:5000/test/yyy/12`
404 :`http://localhost:5000/test/yyy/s`
正常:`http://localhost:5000/test2`
404 :`http://localhost:5000/test3`
</div>

注意:TemplateRoute和DebuggerRouteHandler都继承于IRouter,是实现前面所述的不出现404错误(继

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解ASP.NET MVC 常用扩展点:过滤器、模型绑定
  • ASP.NET MVC从视图传参到控制器的几种形式
  • ASP.NET MVC 4 中的JSON数据交互的方法
  • ASP.NET MVC制作404跳转实例(非302和200)
  • 详解ASP.NET MVC 利用Razor引擎生成静态页
  • 详解ASP.NET MVC 解析模板生成静态页(RazorEngine)
  • Asp.net MVC下使用Bundle合并、压缩js与css文件详解
  • 详解Asp.Net MVC——控制器与动作(Controller And Action)
  • ASP.NET MVC生成静态页面的方法
  • ASP.NET MVC 导出Word报表

相关文章

  • 2017-05-11常用JavaScript代码提示公共类封装
  • 2017-05-11VS2015使用scanf报错的解决方法
  • 2017-05-11asp.net下用DataSet生成XML的问题
  • 2017-05-11在asp.net中使用加密数据库联接字符串保证数据安全
  • 2017-05-11NopCommerce架构分析之(四)基于路由实现灵活的插件机制
  • 2017-05-11Excel、记事本数据导入到数据库的实现方法
  • 2017-05-11服务器安全狗导致ASP.NET网站运行出错的一个案例
  • 2017-05-11小心!ASP.NET网站发布时的那些坑
  • 2018-08-20基于Cookie使用过滤器实现客户每次访问只登录一次
  • 2017-05-11Asp.Mvc 2.0用户服务器验证实例讲解(4)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • .net自带的库生成zip文件的方法
    • ASP.NET MVC Layout如何嵌套
    • VS2015 免费插件Refactoring Essentials
    • firebird Embedded模式(.net 3.5)
    • asp.net(c#)网页跳转七种方法小结
    • ASP.NET登录注册页面实现
    • Asp.net Core 1.1 升级后操作mysql出错的解决办法
    • Visual Studio 2017 15.5 正式发布!性能再提升
    • Windows Server 2012 R2 Standard搭建ASP.NET Core环境图文教程
    • ASP.NET(C#)中操作SQLite数据库实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有