اخیرا هنگام کار روی یک پروژه که از dotnet core 3.1 و razor page استفاده می کردم، متوجه شدم تغییرات انجام شده در razor view با رفرش صفحه اعمال نمی شود و باید مجدد پروژه را کامپایل کرد. این قضیه کار طراحی و تست برنامه را خیلی سخت می کند.
قضیه از این قرار هست که razor sdk به صورت پیش فرض فقط در هنگام build و publish فقط view ها را compile می کند و اگر می خواهیم در زمان اجرا یا runtime با هر تغییری در فایل cshtml مجدد اعمال شود باید این تنظیم را مجزا اعمال کنیم.
برای این کار فقط کافی هست که بسته nuget زیر را به پروژه اضافه کنیم:
Install-Package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
و بعد کد زیر را در startup.css پروژه اضافه میکنیم:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages()
.AddRazorRuntimeCompilation();
// code omitted for brevity
}
به همین راحتی!
اما این پایان ماجرا نیست. چرا که این کار مشکلاتی را در محیط عملیاتی بوجود می آورد.
برای جلوگیری از این مشکلات ما باید این کد را طوری تنظیم کنید که فقط در زمان توسعه اعمال شود و در باقی مواقع این تغییرات اعمال نشود.
خب برای اینکار باید تغییرات کوچکی در کد بالا بدهیم.
ابتدا باید بسته nuget را طوری تنظیم کنیم که فقط در زمان توسعه به پروژه افزوده شود. پس کد فایل csproj را به صورت زیر ویرایش میکنیم:
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="3.1.0" Condition="'$(Configuration)' == 'Debug'" />
نکته اصلی ویژگی condition هست.
سپس کد startup را به صورت زیر تغییر می دهیم:
public IWebHostEnvironment Env { get; set; }
public void ConfigureServices(IServiceCollection services)
{
IMvcBuilder builder = services.AddRazorPages();
#if DEBUG
if (Env.IsDevelopment())
{
builder.AddRazorRuntimeCompilation();
}
#endif
// code omitted for brevity
}
حالا اگه پروژه را وقتی در حال اجراست تغییر بدهید، با رفرش کردن دوباره کامپایل و تغییرات نمایش داده می شوند.
منبع:
https://docs.microsoft.com/en-us/aspnet/core/mvc/views/view-compilation?view=aspnetcore-3.0
دیدگاهتان را بنویسید