Asp.net Vnext Routing

概述



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

运行截图

IActionConstraintFactory 动作约束

时间: 2024-10-08 10:48:52

Asp.net Vnext Routing的相关文章

Asp.net Vnext &amp; MVC6 系列

vs 2015  rc  vnext  1.0.0-beta4 ,本系列还将持续继续更新 Asp.net Vnext 调试源码 Asp.net Vnext 自定义日志 Asp.net Vnext 中间件实现基本验证 Asp.net Vnext 实现IView Asp.net Vnext TagHelpers Asp.net Vnext Routing Asp.net Vnext IValueProvider Asp.net Vnext ModelBinding Asp.net Vnext 模块化

[译]Introducing ASP.NET vNext and MVC 6

原文:http://www.infoq.com/news/2014/05/ASP.NET-vNext?utm_source=tuicool Part of the ASP.NET vNext initiative, ASP.NET MVC 6 represents a fundamental change to how Microsoft constructs and deploys web frameworks. The goal is to create a host agnostic fr

POCO Controller 你这么厉害,ASP.NET vNext 知道吗?

写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 POJO 与 PO.VO 的区别 POJO 的扩展 POCO VS DTO Controller 是什么? 关于 POCO Controller POCO Controller 应用 识别 POCO Controller 简单 POCO Controller IActionResultHelper IModelMetadataProvider.ViewDataDictionary IActionDiscovery

Introduction to ASP.NET vNext

Introduction to ASP.NET vNext In the next version of ASP.NET we are working with multiple teams around Microsoft to create a lean, composable .NET stack that provides a familiar and modern framework for web and cloud scenarios. This new stack will co

Asp.net vNext 学习之路(一)

概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新设计, asp.net vNext是一 个比较理想的选择对于构建现代Web应用程序来说.它为部署到云端或者运行在本地的应用程序提供了一个优化的开发框架,它的模块化组件以最小的 开销让你可以灵活地构建你的解决方案. asp.net vNext 包括以下几个特性: 1,新的灵活和跨平台的运行时. 2,新的模块化HTTP请求管道. 3,云计算环境的

[转载]Getting Started with ASP.NET vNext and Visual Studio 14

说在转载之前的话:ASP.NET框架之前不断做大,而vNext则是从头开始,对ASP.NET框架进行拆分并瘦身,面对不同的需求而更加灵活,各个拆分出来的模块更加轻量.vNext的出现,对ASP.NET开发人员又是一次洗礼,ASP.NET开发人员是辛苦的,但也幸运的:俗话说,不进则退,vNext - 新的学习方向. --------------------------------------------------------------------------------------------

微软 ASP.NET vNext MVC6 Web API3 新特性

今天讲课系统NET vNext 新特性ASP.NET vNext新特性, MVC6, Web API 3.0新特性,Roslyn编译器 ..NET Native.nGEN.JIT64和RyuJIt新特性.Visual Studio 2014新特性,并且做了Demo 你知道下一代.NET新变化,还有他们之间的关系吗?@微软中国MSDN @微软中国TechNet @微软中国 微软实战训练营 ! 国内最新的课程!贴近中外名企一线开发! http://54peixun.com/MSTrainingCam

初次开发 ASP.NET vNext 续篇:云优化的概念、Entity Framework 7.0、目前性能还不够好

继续上一篇<开发 ASP.NET vNext 初步总结(使用Visual Studio 2014 CTP1)>之后, 关于云优化和版本控制: 我本想做一下MAC和LINUX的self-host测试,但是官方说运行环境的MONO版本至少需要3.4.1,我去年买了个表,至本文发布为止,你让我下地狱去找3.4.1吗,硬着头皮用3.4.0搞了一晚上,MAC一直停留在 httpapi.dll出错,Ubuntu Server 12.0.4 是不认其中的几个DLL包,具体哪几个也忘了,过段时间有了稳定版本再

Asp.net vNext 学习之路(三)

asp.net vNext 对于构建asp.net 程序带来了一些重大的改变,让我们开发asp.net 程序的时候更加的方便和高效. 1,可以很容易的去管理客户端的包比如jquery,bootstrap,angular. 2,能够自动的完成less 的编译,javascript 的压缩和单元测试. 3,在web 开发社区有非常丰富的工具生态系统. vs 2015 中有一些自动化的编译工具来支持一些第三方的工具, 1,Bower,可以看作是web 应用的包管理工具,bower 可以安装和恢复客户端