ASP.NET Core - 路由



在 MVC 框架中,我們有三個元件,每個元件都專注於工作的特定部分。為了使所有這些都能正常工作,我們需要找到一種方法將這些 HTTP 請求傳送到正確的控制器。在 ASP.NET Core MVC 中,此過程稱為路由。路由是將 HTTP 請求定向到控制器的過程。

現在讓我們瞭解如何將請求路由到不同的控制器。

  • ASP.NET Core 中介軟體需要一種方法來確定給定的 HTTP 請求是否應該轉到控制器進行處理。

  • MVC 中介軟體將根據 URL 和我們提供的一些配置資訊做出此決定。在本章中,我們將定義此配置資訊,或者您可以說在新增 MVC 中介軟體時在 Startup.cs 中定義路由資訊。

  • 這種方法通常被稱為基於約定的路由。以下是傳統路由的程式碼片段。

routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}"); 
  • 在這種方法中,我們定義模板來告訴 MVC 如何檢視 URL 並找到控制器名稱和操作名稱,其中控制器是 C# 類,操作是該類上的公共方法。

在上一章中,我們在應用程式中建立了一個控制器(HomeController),它是一個 C# 類,不需要從基類派生或實現介面或具有任何特殊屬性。它是一個普通的 C# 類,具有名稱 HomeController,並且包含 Index 方法,該方法返回一個字串。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppdemo.Controllers { 
   public class HomeController { 
      public string Index() { 
         return "Hello, World! this message is from Home Controller..."; 
      } 
   }
}     

在這裡,我們將重點關注**路由到控制器**。我們還將嘗試瞭解路由的工作原理。

現在讓我們回到**Startup 類**,我們在這裡將 MVC 中介軟體配置到我們的應用程式中。在 Configure 方法內部,我們使用了一個方法**UseMvcWithDefaultRoute**。

public void Configure(IApplicationBuilder app) { 
   app.UseIISPlatformHandler();  
   
   app.UseDeveloperExceptionPage(); 
   app.UseRuntimeInfoPage();  
   
   app.UseFileServer(); 
   app.UseMvcWithDefaultRoute();  
   
   app.Run(async (context) => { 
      var msg = Configuration["message"]; 
      await context.Response.WriteAsync(msg); 
   });  
}

這為我們提供了一個預設路由規則,允許我們訪問**HomeController**。與其使用**UseMvcWithDefaultRoute**,不如使用**UseMvc**,然後使用命名方法**ConfigureRoute**在此處配置路由。以下是 Startup.cs 檔案的實現。

using Microsoft.AspNet.Builder; 
using Microsoft.AspNet.Hosting; 
using Microsoft.AspNet.Http; 

using Microsoft.Extensions.DependencyInjection; 
using Microsoft.Extensions.Configuration; 
using Microsoft.AspNet.Routing; 
using System;  

namespace FirstAppDemo { 
   public class Startup { 
      public Startup() { 
         var builder = new ConfigurationBuilder() .AddJsonFile("AppSettings.json"); 
         Configuration = builder.Build(); 
      }  
      public IConfiguration Configuration { get; set; } 
      
      // This method gets called by the runtime. 
      // Use this method to add services to the container. 
      // For more information on how to configure your application, 
      // visit http://go.microsoft.com/fwlink/?LinkID=398940 
      public void ConfigureServices(IServiceCollection services) { 
         services.AddMvc(); 
      }  
        
      // This method gets called by the runtime.  
      // Use this method to configure the HTTP request pipeline. 
      public void Configure(IApplicationBuilder app) { 
         app.UseIISPlatformHandler();  
         
         app.UseDeveloperExceptionPage(); 
         app.UseRuntimeInfoPage();  
         
         app.UseFileServer(); 
         app.UseMvc(ConfigureRoute);  
         
         app.Run(async (context) => { 
            var msg = Configuration["message"]; 
            await context.Response.WriteAsync(msg); 
         });
      }  
      private void ConfigureRoute(IRouteBuilder routeBuilder) { 
         //Home/Index 
         routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}");
      }  
        
      // Entry point for the application. 
      public static void Main(string[] args) => WebApplication.Run<Startup>(args);
   } 
}  

在**ConfigureRoute**方法內部,您可以配置您的路由;您可以看到此方法必須採用 IRouteBuilder 型別的引數。路由的目標是描述 ASP.NET Core MVC 將用於處理 HTTP 請求並查詢可以響應該請求的控制器的規則。

  • 您可以有一條路由可以將請求對映到不同的控制器。

  • 我們可以告訴 routeBuilder 我們想要對映一條新路由,其名稱為“Default”,然後提供最重要的路由資訊,即模板。

  • 模板是一個字串,它將向 ASP.NET Core MVC 描述如何分解 URL。

  • 在最後一個示例中,我們添加了一個 HomeController,因此您也可以請求以下任何 URL,它們也將被定向到 HomeController 上的 Index 操作。

    • https://:49940
    • https://:49940/Home
    • https://:49940/Home/Index
  • 當瀏覽器請求**http://mysite/ 或 http://mysite/Home**時,它會從 HomeController 的 Index 方法獲取輸出。

  • 您也可以嘗試在瀏覽器中更改 URL 來實現這一點。在此示例中,它是**https://:49940/,**除了埠可能不同。

  • 如果您將 /Home 或 /Home/Index 附加到 URL 並按 Enter 鍵,您將看到相同的結果。

  • ID 末尾的問號表示此引數是可選的。換句話說,ASP.NET Core MVC 不必在這裡看到某種 ID,它可能是數字、字串或 GUID。

讓我們在瀏覽器中執行應用程式。應用程式執行後,您將看到以下輸出。

Output

您可以看到 app.Run 中介軟體彈出的訊息,我們收到此訊息的原因是 MVC 中介軟體看到了該 URL。這是一個對網站根目錄的請求,在 URL 中沒有找到控制器名稱或操作名稱。網站根目錄放棄處理該請求並將請求傳遞給下一部分中介軟體,即**app.Run**程式碼。我們指定的路由模板與預設模板完全不同。

在預設模板中,如果未找到控制器和操作名稱,則會應用一些預設值。如果請求進入網站根目錄,則預設控制器名稱將為 Home。您可以根據需要將其更改為任何其他控制器,並且預設操作名稱可以為 Index。如果需要,您還可以更改預設操作,如下面的程式所示。

private void ConfigureRoute(IRouteBuilder routeBuilder) { 
   //Home/Index 
   routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}"); 
}

如果請求進入網站根目錄,MVC 不會看到控制器/操作型別的 URL,但它可以使用這些預設值。

讓我們儲存 Startup.cs 檔案並重新整理瀏覽器到網站根目錄。

Root Of the Website

您現在將看到來自控制器的響應,您還可以轉到 /home,它將呼叫預設操作,即 index。您還可以轉到 /home/index,現在 MVC 將從 URL 中提取控制器名稱和操作名稱。

讓我們透過新增另一個類並將其稱為**AboutController**來建立另一個控制器。

About Controller

讓我們新增一些簡單的操作方法,這些方法將返回字串,如下面的程式所示。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks;  

namespace FirstAppDemo.Controllers  { 
   public class AboutController { 
      public string Phone() { 
         return "+49-333-3333333"; 
      }  
      public string Country() { 
         return "Germany"; 
      } 
   } 
} 

在此控制器中,您可以看到兩個操作方法 - Phone 和 Country,它們將分別僅返回電話號碼和國家/地區名稱。我們稍後會介紹花哨的 HTML。讓我們儲存此檔案並在根 URL 末尾指定 /about/phone。

Two Action Methods

您可以看到上面的螢幕截圖中的電話號碼。如果您指定** /about/country**,您也將看到國家/地區的名稱。

Country Name

如果您轉到** /about**,它將再次穿過中介軟體並轉到您的 app.Run 中介軟體,您將看到以下頁面。

About

在這裡,ASP.NET Core MVC 轉到 AboutController,但沒有找到指定的動作。因此,它將預設為 Index,並且此控制器沒有 Index 方法,然後請求將轉到下一部分中介軟體。

廣告

© . All rights reserved.