- ASP.NET Core 教程
- ASP.NET Core - 首頁
- ASP.NET Core - 概述
- ASP.NET Core - 環境設定
- ASP.NET Core - 新建專案
- ASP.NET Core - 專案佈局
- ASP.NET Core - Project.Json
- ASP.NET Core - 配置
- ASP.NET Core - 中介軟體
- ASP.NET Core - 異常
- ASP.NET Core - 靜態檔案
- ASP.NET Core - 設定 MVC
- ASP.NET Core - MVC 設計模式
- ASP.NET Core - 路由
- ASP.NET Core - 屬性路由
- ASP.NET Core - 操作結果
- ASP.NET Core - 檢視
- 設定 Entity Framework
- ASP.NET Core - DBContext
- ASP.NET Core - Razor 佈局檢視
- ASP.NET Core - Razor 檢視啟動
- ASP.NET Core - Razor 檢視匯入
- ASP.NET Core - Razor 標籤助手
- ASP.NET Core - Razor 編輯表單
- ASP.NET Core - 身份概述
- ASP.NET Core - 授權屬性
- 身份配置
- ASP.NET Core - 身份遷移
- ASP.NET Core - 使用者註冊
- ASP.NET Core - 建立使用者
- ASP.NET Core - 登入和登出
- ASP.NET Core 有用資源
- ASP.NET Core - 快速指南
- ASP.NET Core - 有用資源
- ASP.NET Core - 討論
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。
讓我們在瀏覽器中執行應用程式。應用程式執行後,您將看到以下輸出。
您可以看到 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 檔案並重新整理瀏覽器到網站根目錄。
您現在將看到來自控制器的響應,您還可以轉到 /home,它將呼叫預設操作,即 index。您還可以轉到 /home/index,現在 MVC 將從 URL 中提取控制器名稱和操作名稱。
讓我們透過新增另一個類並將其稱為**AboutController**來建立另一個控制器。
讓我們新增一些簡單的操作方法,這些方法將返回字串,如下面的程式所示。
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。
您可以看到上面的螢幕截圖中的電話號碼。如果您指定** /about/country**,您也將看到國家/地區的名稱。
如果您轉到** /about**,它將再次穿過中介軟體並轉到您的 app.Run 中介軟體,您將看到以下頁面。
在這裡,ASP.NET Core MVC 轉到 AboutController,但沒有找到指定的動作。因此,它將預設為 Index,並且此控制器沒有 Index 方法,然後請求將轉到下一部分中介軟體。