Asp.net Vnext Routing
2015-07-05 17:11
501 查看
概述
本文已经同步到《Asp.net Vnext 系列教程 》中]
ASP.NET 路由系统是主要负责两个操作:
它将传入的 HTTP 请求映射到路由处理程序给出的路由的集合。
路由系统的责任是找到匹配的路由,创建路由数据,并将请求分配给一个处理程序。
选择动作是 MVC 的处理程序的实现细节。它使用路由数据和从传入请求其他信息来选择要执行的操作
代码实现TemplateRoute 类初始化路由和 URL 模板
启动类
实现IRouter添加默认路由
实现IRouteConstraint约束
路由特性
RouteConstraintAttribute 路由约束
应用在控制上
添加路由条目
运行截图
Area
添加路由条目
本文已经同步到《Asp.net Vnext 系列教程 》中]
ASP.NET 路由系统是主要负责两个操作:
它将传入的 HTTP 请求映射到路由处理程序给出的路由的集合。
路由系统的责任是找到匹配的路由,创建路由数据,并将请求分配给一个处理程序。
选择动作是 MVC 的处理程序的实现细节。它使用路由数据和从传入请求其他信息来选择要执行的操作
代码实现TemplateRoute 类初始化路由和 URL 模板
public class MyTemplateRoute : TemplateRoute { public MyTemplateRoute(IRouteBuilder routeCollectionBuilder) : base(routeCollectionBuilder.DefaultHandler, "{controller}/{action}/{id?}", new RouteValueDictionary(new { controller = "Home", action = "Index" }), new RouteValueDictionary(new { }), new RouteValueDictionary(new { }), routeCollectionBuilder.ServiceProvider.GetService<IInlineConstraintResolver>()) { } public override Task RouteAsync(RouteContext context) { return base.RouteAsync(context); } }
启动类
public class Startup { // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app) { app.UseMvc(routes => { //加入模板 默认http://http://localhost/Home/Index routes.Routes.Add(new MyTemplateRoute(routes)); }); } }
实现IRouter添加默认路由
public class DefaultRoute : IRouter { private readonly IRouter _next; public DefaultRoute(IRouter next) { _next = next; } public VirtualPathData GetVirtualPath(VirtualPathContext context) { return _next.GetVirtualPath(context); } public async Task RouteAsync(RouteContext context) { var oldRouteData = context.RouteData; var newRouteData = new RouteData(oldRouteData); newRouteData.Routers.Add(_next); newRouteData.Values["controller"] = "Home"; newRouteData.Values["action"] = "Index"; try { context.RouteData = newRouteData; await _next.RouteAsync(context); } finally { if (!context.IsHandled) { context.RouteData = oldRouteData; } } } }
public void Configure(IApplicationBuilder app) { app.UseMvc(routes => { //加入模板 默认http://http://localhost/Home/Index // routes.Routes.Add(new MyTemplateRoute(routes)); routes.MapRoute("default", "{controller}/{action}"); //加入路由处理 默认http://http://localhost/Home/Index routes.Routes.Add(new DefaultRoute(routes.DefaultHandler)); }); }
实现IRouteConstraint约束
public class DateConstraint : IRouteConstraint { public bool Match(HttpContext httpContext, IRouter route, string routeKey, IDictionary<string, object> values, RouteDirection routeDirection) { return values["controller"] == "Home"; } }
public void Configure(IApplicationBuilder app) { app.UseMvc(routes => { //加入模板 默认http://http://localhost/Home/Index // routes.Routes.Add(new MyTemplateRoute(routes)); //routes.MapRoute("default", "{controller}/{action}"); ////加入路由处理 默认http://http://localhost/Home/Index //routes.Routes.Add(new DefaultRoute(routes.DefaultHandler)); //加入约束 routes.MapRoute(name: "TestRoute", template: "{*constraints}", defaults: new { controller = "Home", action = "Index" }, constraints: new { constraint = new DateConstraint() }); }); }
路由特性
public class HomeController : Controller { //PUT http://localhost/AB [AcceptVerbs("PUT", Route = "AB")] // Patch http://localhost/AB [HttpPatch("AB")] //PUT http://localhost/Home/AB [AcceptVerbs("PUT", Route = "Home/AB")] //Patch http://localhost/Home/AB [HttpPatch("Home/Ab")] // ABC 动作 可以被以下地址访问 //PUT http://localhost/AB // Patch http://localhost/AB //PUT http://localhost/Home/AB //Patch http://localhost/Home/AB public IActionResult ABC() { return Content("1"); } } }
RouteConstraintAttribute 路由约束
public class CountrySpecificAttribute : RouteConstraintAttribute { public CountrySpecificAttribute(string countryCode) : base("country", countryCode, blockNonAttributedActions: true) { } }
应用在控制上
添加路由条目
routes.MapRoute( "products", "Products/{country}/{action}", defaults: new { controller = "Products" })yu
运行截图
Area
//区域名 [Area("Admin")] //路由 [Route("[area]/Users")] public class UserManagementController : Controller { [HttpGet("All")] public IActionResult ListUsers() { return Content("11"); } }
添加路由条目
routes.MapRoute("areaRoute", "{area:exists}/{controller}/{action}", new { controller = "Home", action = "Index" });
相关文章推荐
- ASP.NET常用的控件怎么添加
- 讨论asp.net通过机器cookie仿百度(google)实现搜索input搜索提示弹出框自己主动
- [每日刷题(2015/7/5)]介绍ASP.NET与ASP的区别
- Java之代理(jdk静态代理,jdk动态代理,cglib动态代理,aop,aspectj)
- aspectj之一 ----- 简介
- .Net3.5 和 VS2008 中的 Asp.Net Ajax
- Asp.Net 分页显示控件
- Asp.Net Ajax的两种基本开发模式
- Asp.Net 用户验证(自定义IPrincipal和IIdentity)
- ASP.NET 5运行时升级到Beta5
- ASP.NET 之异步处理一(Session处理)
- 大型高性能ASP.NET系统架构设计
- ASP.NET菜鸟之路之登录系统
- Asp.net Vnext TagHelpers
- ASP.NET MVC图片管理(上传,预览与显示)
- Asp.net Vnext 实现IView
- c#、.Net和ASP.Net的区别
- 【北大青鸟视频学习】--ASP.NET控件
- ABP(现代ASP.NET样板开发框架)系列之11、ABP领域层——仓储(Repositories)
- 深入理解ASP.NET 5的依赖注入