概述


本文已经同步到《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("");
}
} }

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("");
}
}

添加路由条目

    routes.MapRoute("areaRoute",
"{area:exists}/{controller}/{action}",
new { controller = "Home", action = "Index" });

Asp.net Vnext Routing的更多相关文章

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

    写在前面 阅读目录: POCO 是什么? 为什么会有 POJO? POJO 的意义 POJO 与 PO.VO 的区别 POJO 的扩展 POCO VS DTO Controller 是什么? 关于 P ...

  2. 分享我对 ASP.NET vNext 的一些感受,也许多年回过头看 So Easy!

    写在前面 阅读目录: Visual Studio "14" CTP 关于 ASP.NET vNext ASP.NET vNext 实践 后记 ASP.NET vNext 发布已经过 ...

  3. 开发 ASP.NET vNext 初步总结(使用Visual Studio 14 CTP1)

    新特性: vNext又称MVC 6.0,不再需要依赖System.Web,占用的内存大大减少(从前无论是多么简单的一个请求,System.Web本身就要占用31KB内存). 可以self-host模式 ...

  4. [译]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 init ...

  5. Asp.net vNext 学习1

    Asp.net vNext 学习之路(一) 概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新 ...

  6. Introducing ASP.NET vNext and MVC 6

    [译]Introducing ASP.NET vNext and MVC 6 原文:http://www.infoq.com/news/2014/05/ASP.NET-vNext?utm_source ...

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

    说在转载之前的话:ASP.NET框架之前不断做大,而vNext则是从头开始,对ASP.NET框架进行拆分并瘦身,面对不同的需求而更加灵活,各个拆分出来的模块更加轻量.vNext的出现,对ASP.NET ...

  8. Asp.net vNext 学习之路(一)

    概述 asp.net vNext 也叫 asp.net 5.0,意思是微软推出的下一个版本的asp.net.可以说是微软对asp.net的一个比较重大的重新设计, asp.net vNext是一 个比 ...

  9. 兼容Mono的下一代云环境Web开发框架ASP.NET vNext

    微软在2014年5月12日的TechEd大会上宣布将会发布下一代ASP.NET框架ASP.NET vNext的预览.此次发布的ASP.NET框架与以前相比发生了根本性的变化,凸显了微软“云优先”(cl ...

随机推荐

  1. hibernate中@Entity和@Table的区别

    Java Persistence API定义了一种定义,可以将常规的普通Java对象(有时被称作POJO)映射到数据库.这些普通Java对象被称作Entity Bean.除了是用Java Persis ...

  2. maven 无法安装plugin的问题

    spring有一个入门例子,在docker里跑spring-boot程序 下载后按照教程执行mvn package docker:build.并不能成功.会报错. [ERROR] No plugin ...

  3. flock防止重复rsync

    我使用crontab同步一个文件夹时,发现一个问题,我在crontab中设置的1分钟运行一次.但当那个文件夹的内容改变时.1分钟不一定能同步完,但这时第二个rsync进行又起来了. 这个就产生一个问题 ...

  4. C++Primer 第十四章

    //1.当运算符作用于类类型运算对象时,可以通过运算符重载重新定义该运算符的含义.明智的使用运算符重载能令程序更加易于编写和阅读. //2.重载的运算符是具有特殊名字的函数,它们由关键字operato ...

  5. G面经prepare: Maximum Subsequence in Another String's Order

    求string str1中含有string str2 order的 subsequence 的最小长度 DP做法:dp[i][j]定义为pattern对应到i位置,string对应到j位置时,shor ...

  6. struts2 标签字体大小

    <style type="text/css"> label{ font-size: 20px; } </style> <s:textfield nam ...

  7. Java基础(37):Java中日期的显示与格式定值----Date与SimpleDateFormat的试用

    使用 Date 和 SimpleDateFormat 类表示时间 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类.这个类最主要的作用就是获取 ...

  8. HDU 5000 Clone(离散数学+DP)(2014 ACM/ICPC Asia Regional Anshan Online)

    Problem Description After eating food from Chernobyl, DRD got a super power: he could clone himself ...

  9. 关于 VS 无法转到定义和无法转到使用的问题

    今天提交完代码以后突然发现  咦  怎么F12 .点击右键的方法都不能转到定义了    转到引用 也提示  没有发现   重启VS  还是不行 .去找王晓  他也不清楚(其实我知道 他应该也不清楚  ...

  10. SQL Server2008 错误源:.net SqlClient data provider的解决方法

    今天下午直接在SQL Server 2008的Microsoft SQL Server Management Studio 中修改一张表中某个字段, 不管是删除字符还是添加都提示下面的错误. 网上很多 ...