原文連接 :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屬性進行操做。相反,咱們與裝飾它HttpGet,HttpPost,HttpPut,HttpDelete的屬性。
或者,咱們能夠看看不一樣的場景:
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" }); |
有幾個可用的約束,如布爾,日期時間,小數,最小值,最大值,正則表達式等。