Trong khung MVC, chúng tôi có ba thành phần, mỗi thành phần tập trung vào một phần cụ thể của công việc. Để tất cả điều này hoạt động, chúng ta cần tìm cách gửi các yêu cầu HTTP này đến bộ điều khiển phù hợp. Trong ASP.NET Core MVC, quá trình này được gọi là định tuyến. Định tuyến là quá trình chuyển yêu cầu HTTP đến bộ điều khiển.
Bây giờ chúng ta hiểu làm thế nào để định tuyến các yêu cầu đến các bộ điều khiển khác nhau..
Phần mềm trung gian ASP.NET Core cần một cách để xác định xem một yêu cầu HTTP cụ thể có nên đến bộ điều khiển để xử lý hay không.
Phần mềm trung gian MVC sẽ đưa ra quyết định này dựa trên URL và một số thông tin cấu hình mà chúng tôi cung cấp. Trong chương này, chúng tôi sẽ định nghĩa thông tin cấu hình này hoặc bạn có thể nói thông tin định tuyến bên trong Startup.cs khi chúng tôi thêm phần mềm trung gian MVC.
Cách tiếp cận này thường được gọi là định tuyến dựa trên quy ước. Sau đây là đoạn mã cho định tuyến thông thường.
routeBuilder.MapRoute("Default", "{controller=Home}/{action=Index}/{id?}");
Theo cách tiếp cận này, chúng tôi định nghĩa các mẫu cho MVC biết cách xem URL và tìm tên trình điều khiển và tên hành động trong đó trình điều khiển là lớp C # và hành động là phương thức công khai trên lớp đó.
Trong chương trước, chúng ta đã tạo một bộ điều khiển (HomeContoder) trong ứng dụng của chúng ta là lớp C # và không cần phải xuất phát từ lớp cơ sở hoặc thực hiện giao diện hoặc có bất kỳ thuộc tính đặc biệt nào. Nó là một lớp C # đơn giản với một tên, HomeContoder và nó chứa phương thức Index trả về một chuỗi.
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..."; } } }
Ở đây, chúng tôi sẽ tập trung vào việc định tuyến đến bộ điều khiển. Chúng tôi cũng sẽ cố gắng hiểu làm thế nào định tuyến hoạt động.
Bây giờ chúng ta hãy quay trở lại lớp Startup nơi chúng ta đã cấu hình phần mềm trung gian MVC vào ứng dụng của mình. Trong phương thức Configure, chúng tôi đã sử dụng một phương thức 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); }); }
Điều này cung cấp cho chúng tôi một quy tắc định tuyến mặc định cho phép chúng tôi truy cập HomeContoder. Thay vì sử dụng UseMvcWithDefaultRoute, chúng ta hãy sử dụng UseMvc, sau đó định cấu hình tuyến đường tại thời điểm này bằng phương thức có tên ConfigureRoute. Sau đây là việc thực hiện tệp 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); } }
Trong phương thức ConfigureRoute, bạn có thể định cấu hình các tuyến đường của mình; bạn có thể thấy rằng phương thức này phải lấy tham số kiểu IRouteBuilder. Mục tiêu của định tuyến là mô tả các quy tắc mà ASP.NET Core MVC sẽ sử dụng để xử lý yêu cầu HTTP và tìm một bộ điều khiển có thể đáp ứng yêu cầu đó.
Bạn có thể có một tuyến đường có thể ánh xạ các yêu cầu tới các bộ điều khiển khác nhau.
Chúng ta có thể nói với routeBuilder rằng chúng ta muốn ánh xạ một tuyến mới và tên của nó là Mặc định Mặc định và sau đó cung cấp phần thông tin định tuyến quan trọng nhất, đó là mẫu.
Mẫu này là một chuỗi và nó sẽ mô tả cho ASP.NET Core MVC cách tách URL.
Trong ví dụ trước, chúng tôi đã thêm HomeContoder, vì vậy bạn cũng có thể yêu cầu bất kỳ URL nào sau đây và chúng cũng sẽ được chuyển đến hành động Index trên HomeContoder.
- http://localhost:49940
- http://localhost:49940/Home
- http://localhost:49940/Home/Index
Khi một trình duyệt yêu cầu http: // mysite / hoặc http: // mysite / Home, nó sẽ lấy lại kết quả đầu ra từ phương thức Index Index của HomeContoder.
Bạn cũng có thể thử điều này bằng cách thay đổi URL trong trình duyệt. Trong ví dụ này, đó là http: // localhost: 49940 /, ngoại trừ cổng có thể khác nhau.
Nếu bạn nối / Trang chủ hoặc / Trang chủ / Chỉ mục vào URL và nhấn nút Enter, bạn sẽ thấy kết quả tương tự.
Dấu hỏi ở cuối ID có nghĩa là tham số này là tùy chọn. Nói cách khác, ASP.NET Core MVC không phải xem một số loại ID ở đây, có thể là một số hoặc một chuỗi hoặc GUID.
Hãy để chúng tôi chạy ứng dụng trong trình duyệt. Khi ứng dụng được chạy, bạn sẽ thấy đầu ra sau.
Bạn có thể thấy một thông báo bật lên từ ứng dụng. Phần mềm trung gian và lý do chúng tôi nhận được thông báo này là do phần mềm trung gian MVC thấy URL đó. Đây là một yêu cầu đến thư mục gốc của trang web, không tìm thấy tên bộ điều khiển hoặc tên hành động trong URL. Root của trang web đã từ bỏ việc xử lý yêu cầu đó và chuyển yêu cầu đến phần tiếp theo của phần mềm trung gian, đó là mã ứng dụng.Run. Mẫu cho tuyến đường chúng tôi đã chỉ định yên tĩnh không giống như mẫu mặc định.
Trong mẫu mặc định, có một số giá trị mặc định được áp dụng nếu không tìm thấy bộ điều khiển và tên hành động. Nếu một yêu cầu đến gốc của trang web, tên bộ điều khiển mặc định sẽ là Trang chủ. Bạn có thể thay đổi điều đó thành bất kỳ bộ điều khiển nào khác mà bạn muốn và tên hành động mặc định có thể là Index. Bạn cũng có thể thay đổi hành động mặc định nếu bạn muốn như được hiển thị trong chương trình sau.
private void ConfigureRoute(IRouteBuilder routeBuilder) { //Home/Index routeBuilder.MapRoute("Default", "{controller = Home}/{action = Index}/{id?}"); }
Nếu một yêu cầu đến từ gốc của trang web, MVC không thấy loại URL điều khiển / hành động, nhưng nó có thể sử dụng các giá trị mặc định này.
Hãy để chúng tôi lưu tệp Startup.cs và làm mới trình duyệt vào thư mục gốc của trang web.
Bây giờ bạn sẽ thấy một phản hồi từ bộ điều khiển của bạn và bạn cũng có thể đi đến / home sẽ gọi hành động mặc định, đó là chỉ mục. Bạn cũng có thể đi đến / home / index và bây giờ MVC sẽ kéo tên bộ điều khiển và tên hành động ra khỏi URL.
Chúng ta hãy tạo một bộ điều khiển khác bằng cách thêm một lớp khác và gọi nó là AboutContoder.
Chúng ta hãy thêm một số phương thức hành động đơn giản sẽ trả về chuỗi như trong chương trình sau.
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"; } } }
Trong bộ điều khiển này, bạn có thể thấy hai phương thức hành động - Điện thoại và Quốc gia, sẽ chỉ trả lại một số điện thoại và tên quốc gia. Chúng ta sẽ vào HTML ưa thích sau. Hãy để chúng tôi lưu tệp này và chỉ định / about / phone ở cuối URL gốc.
Bạn có thể thấy số điện thoại như trong ảnh chụp màn hình ở trên. Nếu bạn chỉ định / about / country, bạn cũng sẽ thấy tên của quốc gia đó.
Nếu bạn đi đến / về, một lần nữa nó sẽ rơi vào phần mềm trung gian và đi đến ứng dụng của bạn. Phần mềm trung gian và bạn sẽ thấy trang sau.
Ở đây, ASP.NET Core MVC đi đến AboutContoder, nhưng không tìm thấy một hành động nào được chỉ định. Vì vậy, nó sẽ mặc định là Index và bộ điều khiển này không có phương thức Index và sau đó yêu cầu sẽ chuyển sang phần trung gian tiếp theo.