在ASP.NET Core中构建路由的5种方法

原文连接 :https://stormpath.com/blog/routing-in-asp-net-core linux

在ASP.NET Core中构建路由的5种方法 web

 

 

by Team Stormpath | August 17, 2016 | docker

 

在软件开发中,路由用于将全部传入请求映射处处理程序,并生成响应中使用的URL。在ASP.NET Core中,路由已经从根本上重写了。之前,使用MVC和Web API进行路由很是类似,但二者都使用不一样的框架(和代码)来执行相同的操做。一个重要的区别是Web API默认支持RESTful路由。例如,若是一个控制器的操做方法名称开头Post,那么调用一个HTTP Post默认状况下会调用该方法。 api

因为微软决定重建和统一路由框架,如今适用于MVC,也适用于Web API。然而,在咱们深刻了解如何构建路由以前,让咱们回顾一下为何路由对您的应用程序很是重要。 app

为何路由? 框架

SEO友好 优化

REST式配置的路由有助于您的内容的搜索引擎优化(SEO)。网站的网址是影响网站排名的首要标准之一。经过将www.yourwebsite.com/articles/show/123转换为www.yourwebsite.com/how-to-peel-potatoes,您鼓励搜索引擎对与“how to peel potatoes.”有关的关键语句进行排名。 网站

此外,若是您的网址具备更强的描述性,则用户能够更轻松地预测内容,从而增长页面上的时间,这也会影响SEO和总体页面权限。 ui

网址不须要映射文件 

没有路由,传入的请求将被映射到物理文件。经过路由,咱们能够彻底控制请求,使咱们可以决定在某个HTTP请求进入时咱们执行的操做和控制器。 

长URL和文件扩展名能够省略 

在许多参数和过滤器都在使用的状况下,路由有助于缩短URL。经过消除文件扩展名,咱们能够隐藏咱们正在工做的环境。 

那么,咱们如何利用这些好处呢?让咱们看看您能够在ASP.NET Core应用程序中构建路由的五种方法。 

1.建立默认路由 

您能够按照惯例在您的项目Startup类中定义默认路由。 

 

1 

2 

3 

4 

5 

6 

7 

8 

9 

10 

11 

12 

13 

14 

15 

16 

17 

18 

public class Startup 

{ 

    public void ConfigureServices(IServiceCollection services) 

    { 

        services.AddMvc(); 

    } 

  

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 

    { 

        app.UseMvc(routes => 

        { 

            routes.MapRoute( 

                name: "default", 

                template: "  {controller=Home}/{action=Index}/{id?}"); 

        }); 

    } 

} 

经过以上,咱们确保咱们项目中的基本配置存在于Controller + Action + ID(可选)路径的标准MVC模式中。你也能够像这样声明路由模式: 

 

1 

2 

3 

4 

5 

6 

routes.MapRoute( 

    name: "default_route", 

    template: "{controller}/{action}/{id?}", 

    defaults: new { controller = "Home", action = "Index" } 

); 

(这是咱们用来在ASP.NET Core中进行路由的方式。) 

2.扩展默认路由 

一旦咱们配置了默认路由,咱们可能但愿经过根据特定需求添加自定义路由来扩展它。为此,咱们能够使用该MapRoute()方法添加配置。 

 

1 

2 

3 

4 

5 

6 

7 

8 

9 

10 

11 

12 

13 

14 

app.UseMvc(routes => 

{ 

    //New Route 

    routes.MapRoute( 

       name: "about-route", 

       template: "about", 

       defaults: new { controller = "Home", action = "About" } 

    ); 

  

routes.MapRoute( 

    name: "default", 

    template: "{controller=Home}/{action=Index}/{id?}"); 

}); 

咱们添加了一条额外的路线,经过路线授予对主控制器上“关于”操做的访问权限/about。因为默认模式路由仍然存在,所以咱们也能够使用常规/home/about路由访问“关于”页面。 

3.使用属性 

您还能够使用控制器中的属性和操做来配置路由。 

 

1 

2 

3 

4 

5 

6 

7 

8 

9 

10 

11 

12 

13 

14 

15 

16 

[Route("[controller]")] 

public class AnalyticsController : Controller 

{ 

    [Route("Dashboard")] 

    public IActionResult Index() 

    { 

        return View(); 

    } 

  

    [Route("[action]")] 

    public IActionResult Charts() 

    { 

        return View(); 

    } 

} 

在本示例中,咱们能够经过如下路径访问控制器操做: 

  • /Analytics/Dashboard 

  • /Analytics/Charts 

您能够看到这两个标记,[controller][action]指出咱们必须引用已声明的控制器和操做名称。在这种状况下,“Analytics”是控制器的名称,“Charts”是动做的名称,所以它是路由的名称。 

4.构建RESTful路线 

为了声明一个RESTful控制器,咱们须要使用如下路由配置: 

 

1 

2 

3 

4 

5 

6 

7 

8 

9 

10 

11 

12 

13 

14 

15 

16 

17 

[Route("api/[controller]")] 

public class ValuesController : Controller 

{ 

    // GET api/values 

    [HttpGet] 

    public IEnumerable<string> Get() 

    { 

        return new string[] {"hello", "world!"}; 

    } 

  

    // POST api/values 

    [HttpPost] 

    public void PostCreate([FromBody] string value) 

    { 

    } 

} 

在这里,咱们告诉咱们的RESTful服务接受/api/values路由下的呼叫。请注意,咱们再也不使用该Route属性进行操做。相反,咱们与装饰它HttpGetHttpPostHttpPutHttpDelete的属性。 
或者,咱们能够看看不一样的场景: 

 

1 

2 

3 

4 

5 

6 

// POST api/values/5 

[HttpPost("{id}")] 

public void PostUpdate(int id, [FromBody] string value) 

{ 

} 

在这里,咱们有如下路线的控制器值 

  • HTTP Post/values路线将调用Post()行动 

  • HTTP Post/values/PostName路线将调用Post([FromBody]string value)行动 

5.使用约束 

咱们能够将使用约束传递给动做的值的类型进行限制。例如,若是咱们指望一个参数是一个数字,咱们必须将其限制为整数类型。使用大括号在属性中声明约束{id:int} 

 

1 

2 

3 

4 

5 

6 

[HttpGet("{id:int}")] 

public string GetById(int id) 

{ 

    return "item " + id; 

} 

在这里,咱们告诉动做GetByID只接受一个整数参数。向约束添加问号{id:int?}表示该参数是可选的。所以,若是有问号,咱们能够打电话/GetByID/123/GetByID不带附加参数。咱们也能够这样定义在Startup类中声明的默认路由中的约束: 

 

1 

2 

3 

4 

5 

routes.MapRoute( 

    name: "getProductById", 

    template: "Products/{id:int}", 

    defaults: new { controller = "Products", action = "GetById" }); 

相关文章
相关标签/搜索