Biên dịch file Razor trong ASP.NET Core
Nguồn: View compilation
Các file Razor với phần mở rộng .cshtml được biên dịch cả tại thời điểm build và publish bằng cách sử dụng Razor SDK. Runtime compilation (biên dịch tại thời điểm chạy) có thể được bật tùy chọn bằng cách cấu hình dự án.
Lưu ý
Runtime compilation:
- Đã bị đánh dấu là obsolete (lỗi thời) bắt đầu từ .NET 10.
- Không được hỗ trợ cho Razor components của ứng dụng Blazor.
- Không hỗ trợ global using directives.
- Không hỗ trợ implicit using directives.
- Vô hiệu hóa .NET Hot Reload.
- Không được khuyến nghị cho các kịch bản production.
Đối với các kịch bản production, hãy sử dụng build-time compilation (biên dịch tại thời điểm build) mặc định. Đối với các kịch bản phát triển, hãy sử dụng Hot Reload.
Biên dịch Razor
Build-time và publish-time compilation của các file Razor được bật theo mặc định bởi Razor SDK. Khi được bật, runtime compilation bổ sung cho build-time compilation, cho phép cập nhật các file Razor nếu chúng được chỉnh sửa trong khi ứng dụng đang chạy.
Cập nhật Razor views và Razor Pages trong quá trình phát triển khi ứng dụng đang chạy cũng được hỗ trợ bằng cách sử dụng .NET Hot Reload.
Lưu ý: Razor runtime compilation đã bị đánh dấu là obsolete bắt đầu từ .NET 10. Khi được bật, runtime compilation vô hiệu hóa .NET Hot Reload. Chúng tôi khuyến nghị sử dụng Hot Reload thay thế cho các kịch bản phát triển.
Bật runtime compilation cho tất cả môi trường
Để bật runtime compilation cho tất cả môi trường:
- Cài đặt gói NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
- Gọi AddRazorRuntimeCompilation trong
Program.cs:
```csharp var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages() .AddRazorRuntimeCompilation(); ```
Bật runtime compilation có điều kiện
Runtime compilation có thể được bật có điều kiện, đảm bảo rằng đầu ra khi publish:
- Sử dụng các views đã được biên dịch.
- Không bật file watchers (theo dõi file) trong production.
Để chỉ bật runtime compilation cho môi trường Development:
- Cài đặt gói NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
- Gọi AddRazorRuntimeCompilation trong
Program.cskhi môi trường hiện tại được đặt thành Development:
```csharp var builder = WebApplication.CreateBuilder(args);
var mvcBuilder = builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment()) { mvcBuilder.AddRazorRuntimeCompilation(); } ```
Runtime compilation cũng có thể được bật với hosting startup assembly. Để bật runtime compilation trong môi trường Development cho các launch profiles cụ thể:
- Cài đặt gói NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation.
- Sửa đổi phần
environmentVariablescủa launch profile tronglaunchSettings.json: - Xác minh rằng
ASPNETCORE_ENVIRONMENTđược đặt thành"Development". - Đặt
ASPNETCORE_HOSTINGSTARTUPASSEMBLIESthành"Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation". Ví dụ,launchSettings.jsonsau bật runtime compilation cho các launch profilesViewCompilationSamplevàIIS Express:
``json { "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:7098", "sslPort": 44332 } }, "profiles": { "ViewCompilationSample": { "commandName": "Project", "dotnetRunMessages": true, "launchBrowser": true, "applicationUrl": "https://localhost:7173;http://localhost:5251", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" } }, "IIS Express": { "commandName": "IISExpress", "launchBrowser": true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development", "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" } } } } ``
Với cách tiếp cận này, không cần thay đổi code trong Program.cs. Tại runtime, ASP.NET Core tìm kiếm thuộc tính HostingStartup cấp assembly trong Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation. Thuộc tính HostingStartup chỉ định code khởi động ứng dụng cần thực thi và code khởi động đó bật runtime compilation.
Bật runtime compilation cho Razor class library
Hãy xem xét một kịch bản trong đó dự án Razor Pages tham chiếu đến Razor class library (RCL) có tên MyClassLib. RCL chứa file _Layout.cshtml được sử dụng bởi các dự án MVC và Razor Pages. Để bật runtime compilation cho file _Layout.cshtml trong RCL đó, hãy thực hiện các thay đổi sau trong dự án Razor Pages:
- Bật runtime compilation với hướng dẫn tại phần Bật runtime compilation có điều kiện.
- Cấu hình MvcRazorRuntimeCompilationOptions trong
Program.cs:
```csharp var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.Configure<MvcRazorRuntimeCompilationOptions>(options => { var libraryPath = Path.GetFullPath( Path.Combine(builder.Environment.ContentRootPath, "..", "MyClassLib"));
options.FileProviders.Add(new PhysicalFileProvider(libraryPath)); }); ```
Đoạn code trên xây dựng đường dẫn tuyệt đối đến RCL MyClassLib. PhysicalFileProvider API được sử dụng để định vị các thư mục và file tại đường dẫn tuyệt đối đó. Cuối cùng, instance PhysicalFileProvider được thêm vào một collection file providers, cho phép truy cập vào các file .cshtml của RCL.