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

相關文章
相關標籤/搜索