- Razor Pages cung cấp một mô hình tập trung vào trang dựa trên ASP.NET Core, chia sẻ cùng một hệ thống định tuyến, middleware và công cụ hiển thị Razor mạnh mẽ như MVC.
- Các dự án thực tế tập trung vào thư mục Pages, wwwroot, appsettings.json và Program.cs, nơi cấu hình các dịch vụ, phần mềm trung gian và xử lý lỗi.
- Các công cụ như Visual Studio, Rider và VS Code giúp đơn giản hóa quá trình phát triển, gỡ lỗi, điều hướng và tái cấu trúc các mô hình, khung nhìn và cú pháp Razor.
- ASP.NET Core đơn giản hóa việc xuất bản ứng dụng Razor lên IIS, Azure, máy chủ tùy chỉnh hoặc Docker, cho phép triển khai có khả năng mở rộng và lặp lại.
Nếu bạn đã quen thuộc với Angular và ASP.NET Web API và đang bắt đầu thích thú với C# ở phần backend, thì Razor Pages là một cách vô cùng tự nhiên để mang niềm vui đó lên phần frontend mà không cần từ bỏ kiến thức JavaScript hiện có của bạn. Thay vì lao thẳng vào một kiến trúc giao diện người dùng hoàn toàn khác, bạn có thể tiếp tục sử dụng ASP.NET Core quen thuộc, dùng cú pháp Razor để render phía máy chủ, và vẫn có thể thêm JavaScript ở những nơi cần thiết.
ASP.NET Core Razor Pages là phương pháp được Microsoft khuyến nghị để xây dựng các ứng dụng web hiện đại trên .NET, cung cấp một mô hình dựa trên trang gọn gàng nằm trên nền tảng mạnh mẽ của ASP.NET Core. Nó hoạt động trên nhiều nền tảng, tương thích liền mạch với các công cụ như Visual Studio, Visual Studio Code và JetBrains Rider, và có khả năng mở rộng từ các nguyên mẫu nhỏ đến các ứng dụng cấp độ sản xuất, được hỗ trợ bởi cơ sở dữ liệu. Trong hướng dẫn này, chúng ta sẽ cùng tìm hiểu cấu trúc của các ứng dụng Razor Pages thực tế, cách Program.cs kết nối mọi thứ lại với nhau, cách thức hoạt động của các tệp tĩnh và cấu hình, cũng như vai trò của công cụ, gỡ lỗi và triển khai.
ASP.NET Core Razor Pages thực chất là gì (và so sánh với MVC như thế nào)
Razor Pages là một tính năng của ASP.NET Core cho phép bạn xây dựng các ứng dụng web dựa trên các trang thay vì các bộ điều khiển, mang đến một mô hình tư duy đơn giản hơn trong khi vẫn sử dụng cùng một khung nền tảng như MVC. Về cơ bản, nó hoạt động trên cùng một hệ thống định tuyến, phần mềm trung gian và máy chủ như các bộ điều khiển và giao diện người dùng, nhưng mỗi trang xử lý hành vi riêng của nó thay vì tập trung mọi thứ vào các lớp bộ điều khiển.
Mỗi trang Razor thường được biểu diễn bằng một cặp tệp: một tệp .cshtml chứa mã HTML và một tệp .cshtml.cs chứa logic C# của trang. Tệp .cshtml chứa mã HTML của bạn được kết hợp với cú pháp Razor (ví dụ: vòng lặp, điều kiện và các hàm hỗ trợ HTML), trong khi tệp mã phía sau .cshtml.cs chứa các phương thức xử lý như OnGet, OnPost, thuộc tính của mô hình và bất kỳ logic nào cần thiết để hiển thị hoặc xử lý trang.
Trước khi có Razor Pages, mô hình chủ đạo trong ASP.NET là MVC, trong đó các bộ điều khiển trả về các khung nhìn và định tuyến tất cả các yêu cầu thông qua các phương thức hành động. MVC vẫn được hỗ trợ đầy đủ và là một mô hình đã được kiểm chứng với các quy ước chặt chẽ, nhưng trong nhiều trường hợp, Razor Pages dễ hiểu hơn vì mã tải và xử lý trang nằm ngay cạnh mã HTML của trang thay vì bị ẩn trong một bộ điều khiển riêng biệt.
Mặc dù Razor Pages chuyển trọng tâm khỏi các bộ điều khiển, nó vẫn sử dụng cùng một công cụ hiển thị của Razor và hỗ trợ cả HtmlHelpers và TagHelpers để tạo HTML động. TagHelpers đặc biệt hữu ích: chúng mở rộng các thẻ HTML thông thường với các thuộc tính như... asp-action, asp-controller or asp-route Như vậy, bạn có thể kết nối các liên kết và biểu mẫu với các điểm cuối máy chủ mà không cần phải viết nhiều URL thủ công hoặc mã JavaScript nội tuyến.
Đối với các nhà phát triển đã biết JavaScript và quen thuộc với các framework SPA, Razor Pages cung cấp một phương pháp kết hợp: HTML được render phía máy chủ để tải nhanh lần đầu và tối ưu hóa SEO, với JavaScript và các thư viện front-end được thêm vào khi cần thiết. Bạn không bị ràng buộc bởi bất kỳ framework JavaScript cụ thể nào, và bạn có thể giữ phần backend và frontend trong cùng một giải pháp, điều này giúp đơn giản hóa việc triển khai và bảo trì.
Tạo và chạy ứng dụng web Razor Pages
Khi bạn tạo một dự án ASP.NET Core Razor Pages mới bằng Visual Studio, Visual Studio Code hoặc Rider, mẫu này sẽ kết nối một ứng dụng tối thiểu nhưng hoàn chỉnh, bao gồm Program.cs, thư mục Pages, các tệp cấu hình và thư mục gốc tĩnh của trang web. Ngay khi cài đặt, bạn đã có một trang web hoạt động mà bạn có thể sử dụng ngay lập tức và sau đó phát triển thành một thứ gì đó phức tạp hơn, chẳng hạn như danh mục phim hoặc bất kỳ ứng dụng nào khác dựa trên dữ liệu.
Trước khi chạy ứng dụng trên HTTPS, ASP.NET Core cần sử dụng chứng chỉ phát triển mà hệ điều hành của bạn tin tưởng, và lần đầu tiên bạn chạy dự án, bạn có thể thấy một hộp thoại yêu cầu bạn tin tưởng chứng chỉ đó. Khi hộp thoại đó xuất hiện, hãy chọn Có Điều này cho thấy bạn đồng ý cho phép sử dụng chứng chỉ phát triển cục bộ cho lưu lượng HTTPS trên máy tính của mình, điều này là cần thiết để kiểm tra đúng cách các điểm cuối bảo mật mà không gây ra cảnh báo trên trình duyệt.
Trên Windows, macOS hoặc Linux, Visual Studio Code cho phép bạn khởi chạy ứng dụng bằng cách nhấn Ctrl+F5 Bạn có thể chạy mà không cần gỡ lỗi, hoặc sử dụng bảng Chạy và Gỡ lỗi nếu muốn gắn trình gỡ lỗi. Lần đầu tiên sử dụng, VS Code có thể yêu cầu bạn chọn loại trình gỡ lỗi, chẳng hạn như... C#, .NET 5+ và .NET Core hoặc cấu hình khởi chạy cụ thể như C#: RazorPagesMovie [https] RazorPagesMovie Tùy thuộc vào phiên bản .NET và cấu hình không gian làm việc của bạn.
Sau khi khởi chạy, trình duyệt mặc định của bạn sẽ mở tại một URL tương tự như sau: https://localhost:<port>Trong đó, cổng được gán ngẫu nhiên hoặc được chỉ định trong launchSettings.json, và bạn đang xem trang chủ được ứng dụng Razor Pages phục vụ. Trong một số mẫu, bạn sẽ thấy http://localhost:5001 hoặc một cổng khác; điều quan trọng là localhost Điều này cho thấy đó là máy tính của bạn chứ không phải máy chủ bên ngoài.
Sau khi hoàn tất quá trình kiểm thử, bạn có thể dừng ứng dụng đang chạy từ IDE của mình: trong Visual Studio Code, sử dụng menu Run và chọn Stop Debugging hoặc nhấn phím Ctrl+C. sự thay đổi+F5Trong khi đó, ở Visual Studio cho Mac, bạn sử dụng Debug > Stop Debugging. Thao tác này sẽ tắt tiến trình máy chủ web Kestrel đã được khởi chạy cho phiên làm việc đó và giải phóng cổng cho các lần chạy khác.
Hiểu cấu trúc dự án: thư mục và các tệp quan trọng
Các ứng dụng Razor Pages thực tế được tổ chức xung quanh một vài thư mục và tệp cấu hình quan trọng mà bạn sẽ thường xuyên làm việc cùng: Pages, wwwroot, appsettings.json và Program.cs (và trong các phiên bản cũ hơn, Startup.cs). Việc làm quen với các thành phần này là rất quan trọng vì hầu hết mọi hướng dẫn, ví dụ hoặc dự án sản xuất đều sử dụng các quy ước giống nhau.
Thư mục Pages là trái tim của một dự án Razor Pages, chứa tất cả các trang .cshtml và các tệp mã phía sau .cshtml.cs cùng với bố cục dùng chung và các phần hiển thị một phần. Mỗi cặp trang (ví dụ: Index.cshtml và Index.cshtml.cs) đại diện cho một điểm cuối có thể gọi được trong ứng dụng của bạn, và các tệp đặc biệt bắt đầu bằng dấu gạch dưới, chẳng hạn như _Layout.cshtmlXác định nội dung được tái sử dụng trên nhiều trang.
Tệp bố cục, thường được đặt tên là _Layout.cshtmlNó xác định giao diện của trang web, chẳng hạn như thanh điều hướng trên cùng, chân trang và thông báo bản quyền, đồng thời cung cấp nơi để hiển thị nội dung của từng trang riêng lẻ. Khi bạn thay đổi bố cục, bạn sẽ ngay lập tức ảnh hưởng đến giao diện và trải nghiệm người dùng của tất cả các trang Razor Pages sử dụng bố cục đó, vì vậy đây là nơi lý tưởng để chỉnh sửa menu, thương hiệu và các tập lệnh hoặc kiểu dùng chung.
Thư mục wwwroot là thư mục gốc của trang web, nơi lưu trữ các tài nguyên tĩnh, bao gồm CSS, JavaScript, hình ảnh và các tệp HTML thuần túy có thể được máy chủ web phục vụ trực tiếp. Bất cứ thứ gì được đặt trong thư mục wwwroot đều có thể được trình duyệt truy cập (tùy thuộc vào cấu hình tệp tĩnh của bạn), do đó đây là nơi thích hợp để lưu trữ các bảng định kiểu trang web, thư viện phía máy khách và hình ảnh được tham chiếu trong mã HTML của bạn.
Thông tin cấu hình của ứng dụng thường được lưu trữ trong... appsettings.json (và các biến thể dành riêng cho từng môi trường như appsettings.Development.json), chứa các thiết lập như chuỗi kết nối và cờ tính năng. Hệ thống cấu hình của ASP.NET Core tải các tệp này và hợp nhất chúng với các biến môi trường và các nhà cung cấp khác, giúp việc liên kết các phần với các lớp tùy chọn được định kiểu mạnh trong mã của bạn trở nên đơn giản.
Tệp Program.cs và quy trình ASP.NET Core
Tệp Program.cs chứa điểm khởi đầu cho ứng dụng Razor Pages của bạn và định nghĩa cách cấu hình máy chủ web, các dịch vụ và quy trình xử lý trung gian trước khi yêu cầu đầu tiên được gửi đến trang web của bạn. Trong các phiên bản ASP.NET Core hiện đại, Program.cs sử dụng mô hình “lưu trữ tối thiểu” được đơn giản hóa với một câu lệnh cấp cao nhất tạo ra một WebApplicationBuilder và sau đó xây dựng và cấu hình WebApplication ví dụ.
Mẫu điển hình trong Program.cs bắt đầu bằng var builder = WebApplication.CreateBuilder(args); thao tác này thiết lập một máy chủ với các cài đặt mặc định thông thường, sau đó gọi builder.Services.AddRazorPages(); Đăng ký Razor Pages với bộ chứa injection dependency. Sau khi cấu hình các dịch vụ, var app = builder.Build(); Tạo đối tượng ứng dụng mà sau đó bạn sẽ kết nối với các middleware và endpoint.
Việc xử lý lỗi và hành vi bảo mật phụ thuộc rất nhiều vào môi trường, vì vậy bạn thường thấy một bước kiểm tra môi trường như sau: if (!app.Environment.IsDevelopment()) để kích hoạt các tính năng đạt tiêu chuẩn sản xuất. Trong điều kiện đó, bạn thường sẽ thấy app.UseExceptionHandler("/Error"); Điều này sẽ chuyển các lỗi chưa được xử lý đến một trang Lỗi chuyên dụng, và app.UseHsts(); Thao tác này kích hoạt HTTP Strict Transport Security (HSTS) để hướng dẫn trình duyệt luôn sử dụng HTTPS cho tên miền của bạn.
Sau đó, chuỗi xử lý phần mềm trung gian được lắp ráp bằng các lệnh gọi như sau: app.UseHttpsRedirection();, app.UseStaticFiles(); or app.MapStaticAssets();, app.UseRouting(); và tùy ý app.UseAuthorization(); Tiếp theo là ánh xạ điểm cuối. Việc chuyển hướng HTTPS buộc các yêu cầu HTTP không an toàn phải được nâng cấp lên HTTPS, phần mềm trung gian tệp tĩnh (hoặc ánh xạ tài sản tĩnh mới hơn trong .NET 9) cho phép phục vụ trực tiếp các tài nguyên từ wwwroot, và định tuyến quyết định điểm cuối nào xử lý từng URL đến.
Cuối cùng, Razor Pages được tích hợp vào hệ thống định tuyến. app.MapRazorPages(); tùy chọn nối tiếp với .WithStaticAssets(); trong các mẫu mới hơn để tích hợp tối ưu hóa tài sản tĩnh, và ứng dụng được khởi chạy bằng cách sử dụng app.Run();. Tại thời điểm đó, ứng dụng đang lắng nghe trên các cổng đã được cấu hình và máy chủ Kestrel đã sẵn sàng xử lý các yêu cầu thực tế, cho dù là cục bộ trong môi trường phát triển hay trên máy chủ sản xuất như IIS, Azure App Service hoặc Docker.
Razor Pages, models và view models trong các ứng dụng thực tế
Đằng sau mỗi ứng dụng Razor Pages không hề tầm thường đều có một tập hợp các mô hình miền và mô hình hiển thị đại diện cho dữ liệu của bạn và cách dữ liệu đó được hiển thị, cho dù bạn đang quản lý danh mục phim, blog hay bảng điều khiển doanh nghiệp. Các mô hình thường tương ứng chặt chẽ với các thực thể trong cơ sở dữ liệu, trong khi các mô hình hiển thị có thể được tùy chỉnh cho một màn hình hoặc luồng người dùng cụ thể, kết hợp nhiều mô hình hoặc giá trị được định dạng sẵn để dễ dàng hiển thị hơn.
Một quy trình phát triển phổ biến là bắt đầu với các lớp C# đơn giản sử dụng các trường và chữ ký phương thức làm các đối tượng giả lập, và dần dần phát triển chúng thành các mô hình hoàn chỉnh với các thuộc tính được đóng gói, các thuộc tính xác thực và logic. Các công cụ như JetBrains Rider giúp quá trình phát triển đó diễn ra suôn sẻ hơn với các thao tác chủ động tự động chuyển đổi các trường thành thuộc tính, tạo các kiểu dẫn xuất cho hệ thống phân cấp kế thừa và áp dụng các thao tác tái cấu trúc khác khi bạn tinh chỉnh mô hình đối tượng của mình.
Kế thừa và giao diện giúp đảm bảo cấu trúc nhất quán cho các mô hình của bạn, điều chỉnh chúng phù hợp với các quy tắc kinh doanh thực tế và cho phép đa hình trong trường hợp một số hành vi được chia sẻ nhưng cách triển khai khác nhau. Ví dụ, bạn có thể có một cơ sở ContentItem kiểu có nguồn gốc Movie, Series và Documentary Các lớp, mỗi lớp có những khác biệt nhỏ nhưng đều tuân theo một hợp đồng chung được sử dụng xuyên suốt ứng dụng của bạn.
Sau khi các mô hình của bạn đã được thiết lập, bạn có thể tạo các trang Razor Pages hoặc MVC bằng tay hoặc thông qua các công cụ tạo khung sườn, các công cụ này sẽ tạo ra các trang để liệt kê, tạo, chỉnh sửa và xóa các thực thể. Việc sử dụng công cụ tạo khung sườn (scaffolding) giúp tăng tốc đáng kể giai đoạn phát triển ban đầu và đảm bảo rằng việc định tuyến, liên kết mô hình và xác thực được kết nối chính xác, sau đó bạn có thể tùy chỉnh bằng mã đánh dấu và kiểu dáng riêng của mình.
Cú pháp Razor được sử dụng trong các tệp .cshtml kết hợp mượt mà với các mô hình và mô hình hiển thị được định kiểu mạnh, cho phép bạn hiển thị dữ liệu, chạy vòng lặp và điều kiện, cũng như tạo liên kết và biểu mẫu bằng HtmlHelpers hoặc TagHelpers mà không làm mất tính an toàn khi biên dịch. Sự kết hợp giữa C# và ngôn ngữ đánh dấu này giúp giữ lại phần lớn logic ở phía máy chủ nhưng vẫn tạo ra mã HTML sạch sẽ trong trình duyệt, tương thích tốt với CSS và JavaScript.
Làm việc với cú pháp Razor, TagHelpers và điều hướng trong Rider
Cú pháp Razor là một lớp mỏng nằm trên HTML, được kích hoạt bất cứ khi nào... @ Biểu tượng này xuất hiện, giúp bạn dễ dàng nhúng các biểu thức, câu lệnh hoặc lời gọi trợ giúp C# trực tiếp vào mã đánh dấu của mình. Bạn có thể lặp qua danh sách các mục, hiển thị hoặc ẩn các phần tử dựa trên điều kiện, hoặc hiển thị giá trị và ngày tháng được định dạng mà không cần viết ngôn ngữ mẫu riêng biệt hoặc rải rác JavaScript khắp nơi.
TagHelpers tạo cảm giác như một phần mở rộng tự nhiên của HTML, nơi các thuộc tính đặc biệt bắt đầu bằng asp- Thay đổi hành vi hoặc đầu ra của các phần tử, thường thay thế các phương thức HtmlHelper cũ hơn và loại bỏ nhu cầu sử dụng mã script nội tuyến. Ví dụ như asp-action và asp-controller để định tuyến các thẻ liên kết và biểu mẫu đến các hành động cụ thể, hoặc định tuyến các thuộc tính như asp-route-id Để truyền tham số một cách rõ ràng trong URL.
Hỗ trợ IDE rất quan trọng khi bạn làm việc chuyên sâu với HTML, và Rider cung cấp các tính năng hữu ích như thanh điều hướng ở cuối trình soạn thảo để hiển thị vị trí hiện tại của bạn trong cấu trúc tài liệu. Bạn có thể tùy chỉnh đường dẫn điều hướng (breadcrumbs) trong mục Tùy chọn hoặc Cài đặt ở phần Trình chỉnh sửa, và chúng giúp việc điều hướng các tệp Razor dài với các thẻ lồng nhau trở nên dễ dàng hơn nhiều.
Trong các dự án MVC, Rider cũng hiểu các quy ước liên kết giữa bộ điều khiển, hành động và giao diện người dùng, vì vậy khi di chuột qua kết quả hành động, bạn có thể thấy các đường dẫn giao diện người dùng khả thi và Ctrl + Nhấp chuột (Hoặc Cmd-Click (trên macOS) sẽ nhảy thẳng đến tệp .cshtml tương ứng. Các phím tắt như Ctrl + B or Cmd-B Cung cấp một cách nhanh chóng để điều hướng qua cơ sở mã của bạn mà không cần phải tìm kiếm trong trình khám phá giải pháp.
Ngoài các công cụ dành riêng cho Razor, Rider còn bao gồm một bộ công cụ và giải pháp nhanh chóng cho HTML, CSS và JavaScript, giúp bạn viết mã phía máy khách sạch sẽ, có cấu trúc tốt ngay trong cùng một IDE với phần backend C# của bạn. Sự tích hợp chặt chẽ này có thể tiết kiệm rất nhiều thao tác chuyển đổi ngữ cảnh khi xây dựng giao diện người dùng tương tác phức tạp vẫn dựa vào các khung nhìn hoặc trang Razor được render phía máy chủ.
Gỡ lỗi ứng dụng Razor Pages và ASP.NET Core
Gỡ lỗi là hoạt động thường nhật trong phát triển web, và các ứng dụng ASP.NET Core chạy trên Razor Pages cũng không ngoại lệ, vì vậy việc có hỗ trợ gỡ lỗi mạnh mẽ trong IDE của bạn là điều cần thiết. Cả Visual Studio và Rider đều cung cấp trình gỡ lỗi tương tác có thể gắn vào tiến trình Kestrel của bạn, từng bước thực thi mã C#, kiểm tra biến và đánh giá biểu thức trong khi ứng dụng đang chạy.
Trình gỡ lỗi của Rider trên Windows hỗ trợ Chỉnh sửa và Tiếp tục, cho phép bạn tinh chỉnh mã trong khi ứng dụng đang tạm dừng tại điểm dừng và áp dụng các thay đổi mà không cần khởi động lại toàn bộ phiên gỡ lỗi. Khả năng sửa chữa những lỗi nhỏ hoặc thử nghiệm trong quá trình gỡ lỗi giúp tăng tốc quá trình khắc phục sự cố đáng kể, đặc biệt là trong các dự án lớn với thời gian khởi động không hề đơn giản.
Trang thông báo lỗi mặc định dành cho nhà phát triển trong ASP.NET Core được tự động kích hoạt khi môi trường được thiết lập ở chế độ Phát triển, cung cấp cho bạn dấu vết ngăn xếp chi tiết, thông tin yêu cầu và chẩn đoán bất cứ khi nào xảy ra các ngoại lệ chưa được xử lý. Chế độ xem này cực kỳ hữu ích trong quá trình gỡ lỗi cục bộ nhưng lại nguy hiểm trong môi trường sản xuất vì nó có thể làm lộ các thông tin nội bộ về ứng dụng và môi trường của bạn.
Để bảo vệ thông tin nhạy cảm, môi trường sản xuất và thử nghiệm thường vô hiệu hóa trang xử lý ngoại lệ dành cho nhà phát triển và thay vào đó sử dụng đường dẫn xử lý ngoại lệ đã được cấu hình, thường là... /ErrorĐể hiển thị màn hình lỗi thân thiện với người dùng trong khi vẫn ghi lại các chi tiết thực tế ở phía máy chủ. Hành vi này được kiểm soát trong Program.cs thông qua việc kiểm tra môi trường và các lệnh gọi đến UseExceptionHandler và UseHsts.
Khi mọi thứ thực sự đi chệch hướng và các hướng dẫn không phù hợp với hành vi của bạn, việc so sánh dự án của bạn với một mẫu tốt đã biết được cung cấp bởi Microsoft hoặc các nguồn đáng tin cậy khác thường rất hữu ích. Nhiều hướng dẫn chính thức về Razor Pages cung cấp một dự án mẫu hoàn chỉnh mà bạn có thể xem hoặc tải xuống để so sánh với mã của riêng mình và phát hiện các cấu hình bị thiếu, lỗi chính tả hoặc các tệp bị đặt sai vị trí.
Xuất bản và triển khai các ứng dụng ASP.NET Core Razor thực tế
Việc triển khai ứng dụng Razor Pages của bạn là lúc tất cả cấu trúc và cấu hình trước đó phát huy tác dụng, bởi vì ASP.NET Core hỗ trợ nhiều tùy chọn triển khai phù hợp với các môi trường lưu trữ và quy trình làm việc khác nhau. Cho dù bạn thích sử dụng IIS trên Windows, container Linux trong Docker, hay một nền tảng được quản lý như Azure App Service, quy trình xuất bản đều có thể được điều khiển bởi MSBuild và tích hợp vào các đường dẫn CI/CD của bạn.
Cả Visual Studio và Rider đều cung cấp các cấu hình xuất bản cho phép đóng gói ứng dụng của bạn và triển khai lên IIS bằng Web Deploy (MSDeploy), sao chép vào thư mục cục bộ hoặc mạng, hoặc đẩy trực tiếp lên máy chủ từ xa qua FTP, FTPS hoặc SFTP. Việc tạo hồ sơ xuất bản mã hóa các thiết lập triển khai của bạn để các lần xuất bản trong tương lai sẽ đơn giản như việc chọn hồ sơ và nhấp vào một nút hoặc chạy một lệnh.
Đối với các kịch bản điện toán đám mây, Azure App Service là một mục tiêu phổ biến, và các IDE tích hợp các công cụ của Azure để tạo và xuất bản ứng dụng web trực tiếp từ dự án của bạn, một lần nữa dựa trên MSBuild và MSDeploy ở phía sau. Cách tiếp cận này giúp duy trì tính nhất quán trong quá trình xây dựng và triển khai giữa môi trường cục bộ và đám mây, đồng thời có thể được tự động hóa trong Azure DevOps, GitHub Actions hoặc các hệ thống CI khác.
Docker là một lựa chọn hàng đầu khác dành cho ASP.NET Core, cho phép bạn đóng gói ứng dụng Razor Pages của mình vào container để có thể chạy một cách ổn định trong bất kỳ môi trường nào hỗ trợ container. Rider và Visual Studio có thể giúp bạn tạo Dockerfile và cấu hình docker-compose, cho phép quy trình làm việc mà bạn có thể phát triển, gỡ lỗi và triển khai ứng dụng của mình bên trong các container, dù là cục bộ hay trên các hệ thống điều phối như Kubernetes.
Bất kể mục tiêu là gì, bước xuất bản sẽ biên dịch mã C# của bạn, đóng gói các view Razor, sao chép các tài nguyên tĩnh và, tùy thuộc vào cài đặt, cũng có thể tạo ra một runtime độc lập để máy chủ không cần cài đặt .NET dùng chung. Việc đóng gói này biến dự án phát triển của bạn thành một sản phẩm có thể triển khai và sẵn sàng cho người dùng thực sử dụng.
Kết hợp tất cả các thành phần này lại với nhau—từ chứng chỉ phát triển và Program.cs, thông qua Pages và wwwroot, đến gỡ lỗi và xuất bản—Razor Pages cung cấp một cách tiếp cận thực tế để xây dựng các ứng dụng web ASP.NET Core thực tế, dễ bảo trì, hiệu suất cao và thuận tiện cho các nhà phát triển đã quen thuộc với C# và chưa sẵn sàng hoàn toàn dựa vào một framework trang đơn cho mọi trường hợp.