dotnet watch run và Hot Reload: Sửa Code .NET Không Cần Restart App
dotnet watch run và Hot Reload: Sửa .cshtml Tự Reload, Sửa C# Bấm Ctrl+R
Mỗi lần sửa một dòng HTML trong file .cshtml, bạn phải chờ app restart. 3 giây, 5 giây, đôi khi 10 giây nếu project to. Nhân lên 50 lần mỗi buổi chiều — bạn vừa lãng phí một khoảng thời gian đáng kể chỉ để nhìn terminal.
Next.js có Hot Module Replacement, tự reload ngay khi lưu file. .NET cũng có cơ chế tương đương — chỉ là ít người biết cách bật đúng. Bài này hướng dẫn từng bước để đạt được đúng trải nghiệm đó.
dotnet watch run Làm Được Gì
dotnet watch là công cụ có sẵn trong .NET SDK, không cần cài thêm gì. Khi chạy, nó theo dõi các file trong project và hỗ trợ Hot Reload — áp dụng thay đổi vào app đang chạy mà không restart process.
bash
dotnet watch runHot Reload hoạt động tốt với các thay đổi nhỏ trong logic: sửa nội dung method, thay đổi giá trị trả về, cập nhật string. Nhưng có những thay đổi Hot Reload không xử lý được — ví dụ thêm property mới vào model, thêm DI service, sửa Program.cs. Những trường hợp này dotnet watch sẽ dừng lại và chờ.
Lúc đó bạn cần bấm Ctrl+R trong terminal để restart thủ công. Đây là behavior by design — .NET team cố tình không tự restart để tránh interrupt khi bạn đang sửa nhiều file liên tiếp.
Ví dụ thực tế hay gặp: bạn thêm property Message vào IndexModel trong file .cs, sau đó muốn dùng @Model.Message trong .cshtml. Nếu không bấm Ctrl+R trước, app vẫn chạy với bản cũ — .cshtml sẽ báo lỗi vì không tìm thấy property đó.
Tại Sao .cshtml Cần Thêm Một Bước Nữa
Mặc định, Razor view (.cshtml) được compile tại thời điểm build — giống như file .cs. Nghĩa là sửa .cshtml → cần rebuild → app restart.
Nhưng có một package tên Razor Runtime Compilation cho phép .cshtml được compile ngay lúc request, không phải lúc build. Kết quả: sửa view → refresh browser → thấy ngay, không cần Ctrl+R, không cần restart.
Đây là cơ chế tách biệt hoàn toàn với Hot Reload của dotnet watch. Cần bật cả hai để có trải nghiệm tốt nhất.
Hướng Dẫn Từng Bước
Bước 1: Tạo project
bash
dotnet new webapp -n RazorHotReloadDemo
cd RazorHotReloadDemoBước 2: Cài Razor Runtime Compilation
bash
dotnet add package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilationBước 3: Bật trong Program.cs
csharp
var builder = WebApplication.CreateBuilder(args);
var razorBuilder = builder.Services.AddRazorPages();
if (builder.Environment.IsDevelopment())
{
razorBuilder.AddRazorRuntimeCompilation();
}
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.MapRazorPages();
app.Run();Bọc trong IsDevelopment() là bắt buộc — runtime compilation tốn thêm RAM và làm chậm startup. Không bật trên production.
Bước 4: Chạy với watch mode
bash
dotnet watch runBước 5: Kiểm tra thực tế — sửa .cshtml
Mở Pages/Index.cshtml, sửa nội dung:
html
@page
@model IndexModel
<h1>Hello TEDU 🔥</h1>
<p>Xem lúc: @DateTime.Now.ToString("HH:mm:ss")</p>Lưu file, quay lại browser, refresh — thấy thay đổi ngay. Terminal không có gì xảy ra, app vẫn chạy bình thường.
Bước 6: Kiểm tra thực tế — sửa file .cs
Thêm property Message vào IndexModel:
csharp
public class IndexModel : PageModel
{
public string Message { get; set; } = "";
public void OnGet()
{
Message = "Loaded at " + DateTime.Now.ToString("HH:mm:ss");
}
}Muốn dùng @Model.Message trong .cshtml? Phải bấm Ctrl+R trong terminal trước. App restart, sau đó sửa .cshtml dùng property mới bình thường — và từ đây sửa tiếp .cshtml lại tự reload như cũ, không cần Ctrl+R nữa.
Bảng Tổng Hợp: Cái Gì Tự Reload, Cái Gì Cần Ctrl+R
Loại thay đổi | Hành vi |
|---|---|
Sửa nội dung | Tự reload — refresh browser là thấy ngay |
Thêm file | Tự reload |
Sửa logic nhỏ trong | Hot Reload tự xử lý |
Thêm property/field mới vào model | Ctrl+R để restart |
Thêm DI service, sửa | Ctrl+R để restart |
Kết Luận
Sau khi setup xong, workflow hàng ngày sẽ là:
Sửa
.cshtml→ refresh browser → thấy ngay, không làm gì thêmThêm property hoặc thay đổi cấu trúc C# → bấm Ctrl+R một lần trong terminal → tiếp tục sửa
.cshtmlbình thường
Ctrl+R tuy thủ công nhưng chỉ cần bấm khi thực sự thay đổi cấu trúc — chiếm khoảng 20% thời gian coding thực tế. 80% còn lại là sửa view, và cái đó đã tự động hoàn toàn.
Nếu bạn đang xây dựng ứng dụng ASP.NET Core với Razor Pages hoặc MVC, đây là setup nên làm ngay từ đầu project — mất 5 phút, tiết kiệm cả trăm lần chờ rebuild mỗi ngày.
Tác giả: TEDU
Chú ý: Tất cả các bài viết trên TEDU.COM.VN đều thuộc bản quyền TEDU, yêu cầu dẫn nguồn khi trích lại trên website khác.
Tags:
Bài viết liên quan
Phân biệt IOptions, IOptionsSnapshot và IOptionsMonitor trong ASP.NET Core: Hướng dẫn chi tiết
hi làm việc với Options Pattern trong ASP.NET Core, việc map (ánh xạ) file appsettings.json sang class C# chỉ là bước đầu tiên. Câu hỏi quan trọng tiếp theo là: Làm thế nào để inject và sử dụng class đó hiệu quả?
Đọc thêm
Xây dựng menu đa cấp với ASP.NET Core MVC
Cách xây dựng menu đa cấp sử dụng đệ quy trong ASP.NET Core MVC
Đọc thêm
Tìm hiểu về ABP Framework, một framework mã nguồn mở trên .NET
ABP Framework là một framework hoàn chỉnh để xây dựng ứng dụng web hiện đại bằng cách áp dụng các best practice và tiêu chuẩn trong phát triển phần mềm.
Đọc thêm
Tìm lỗi ứng dụng ASP.NET Core trên Windows Server sử dụng stdout log
Một số lỗi trong lúc khởi động hệ thống ASP.NET Core trên Windows Server mà chúng ta chưa rõ nguyên nhân tại sao ứng dụng không hoạt động. Vậy bạn có thể dùng đểns stdout để chẩn đoán lỗi.
Đọc thêmVòng đời của Dependency Injection: Transient, Singleton và Scoped
Hiểu về vòng đời của các service được tạo sử dụng Dependency Injection là rất quan trọng trước khi sử dụng chúng.
Đọc thêm
Cơ chế Dependency Injection trong ASP.NET Core
Dependency Injection giờ đã trở thành thành phần chính thức mặc định của ASP.NET Core.
Đọc thêm
Unobtrusive Client Validation trong ASP.NET Corre
Trong bài viết này chúng ta sẽ thực hiện validation phía client sử dụng Javascript.
Đọc thêm
Validation Tag Helper trong ASP.NET Core
ASP.NET cung cấp các tag helper liên quan đến hiển thị validation message cho người dùng.
Đọc thêm
Model Validation trong ASP.NET Core
Bài viết này chúng ta sẽ học về cơ chế Model Validation.
Đọc thêm
Cơ chế Model Binding: Truyền dữ liệu từ View lên Controller
Trong cơ chế Model Binding của ASP.NET Core chúng ta sẽ học cách làm sao để truyền dữ liệu từ View lên Controller.
Đọc thêm