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

关于示例使用,我们先不从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功能 }

在这里,我们设置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; } }

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

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

正常:`:5000/` 正常:`:5000/test/yyy/12` 404 :`:5000/test/yyy/s` 正常:`:5000/test2` 404 :`:5000/test3`

注意:TemplateRoute和DebuggerRouteHandler都继承于IRouter,是实现前面所述的不出现404错误(继续匹配下一个路由)的核心。

MVC中的Routing

在MVC示例程序中,我们只需要配置在调用app.UseMVC方法的时候,使用委托中的MapRoute方法来定义各种route就可以了。在这里我们以空白项目为例,来看看MVC的route如何使用。

第一步:在project.json文件的dependencies节点中引用程序集"Microsoft.AspNet.Mvc": "6.0.0-beta3",
第二部:添加MVC的Middleware,并使用MVC,然后添加一条默认的路由,代码如下:

public void ConfigureServices(IServiceCollection services) { services.AddMvc(); } public void Configure(IApplicationBuilder app) { app.UseMvc(routeBuilder => { routeBuilder.MapRoute( name: "default", template: "{controller}/{action}/{id?}", defaults: new { controller = "Home", action = "Index" }); }); }

第三步:分别创建如下如下三种Controller,其中ProductsController继承于Microsoft.AspNet.Mvc下的Controller。

public class ProductsController : Controller { public IActionResult Index() { return Content("It Works with Controller Base Class!"); } } public class DemoController { public IActionResult Index() { return new ObjectResult("It Works without Controller Base Class!"); } } public class APIController { public object Index() { return new { Code = 100000, Data = "OK" }; } }

访问:5000/products和:5000/demo,均能显示正常的输出结果;而访问:5000/api的时候返回的则是json数据。

这就是我们在前面ASP.NET5新特性中所讲的MVC和API合二为一了,并且也可以不继承于Controller基类(但类名要以Controller结尾)。这种技术的核心是Controller的查找机制,关于如何在一个项目中查找合适的程序集,请参考《Controller与Action》章节。

新版MVC在判定Controller的时候,有2个条件:要么继承于Controller,要么是引用MVC程序集并且类名以Controller结尾。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjysgd.html