Trang chủ Bài viết Lập trình ASP.NET Core dotnet watch run và Hot Reload: Sửa Code .NET Không Cần Restart App
Lập trình ASP.NET Core 06/04/2026 7 lượt xem

dotnet watch run và Hot Reload: Sửa Code .NET Không Cần Restart App

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 run

Hot 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 RazorHotReloadDemo

Bước 2: Cài Razor Runtime Compilation

bash

dotnet add package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Bướ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 run

Bướ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 .cshtml

Tự reload — refresh browser là thấy ngay

Thêm file .cshtml mới

Tự reload

Sửa logic nhỏ trong .cs (không thêm member mới)

Hot Reload tự xử lý

Thêm property/field mới vào model

Ctrl+R để restart

Thêm DI service, sửa Program.cs

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êm

  • Thê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 .cshtml bì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.

Chia sẻ:

Bài viết liên quan