หน้า. NET Core MVC ไม่รีเฟรชหลังจากการเปลี่ยนแปลง


123

ฉันกำลังสร้าง. NET Core MVC ในเวอร์ชันล่าสุด 2.2 ฉันมีปัญหาเมื่อทำการเปลี่ยนแปลงไฟล์ CSHTML และรีเฟรชหน้าการเปลี่ยนแปลงของฉันจะไม่แสดงในเบราว์เซอร์ ฉันต้องรีสตาร์ทโครงการเพื่อดูการเปลี่ยนแปลงของฉัน เหตุการณ์นี้เกิดขึ้นมาระยะหนึ่งแล้วดังนั้นฉันจึงไม่แน่ใจว่าการเปลี่ยนแปลงใดที่ทำให้เกิดปัญหานี้

ฉันได้ลองใช้ "Empty Cache and Hard Reload" ของ Chrome รวมถึงเบราว์เซอร์อื่น ๆ แต่ก็ไม่มีประโยชน์ สิ่งนี้เกิดขึ้นบน Windows และ Mac โดยใช้ทั้ง Visual Studio สำหรับ Mac และ VS Code

ในโปรเจ็กต์. Net Core ที่เป็นค่าเริ่มต้นมันทำงานได้ดีดังนั้นมันต้องเป็นอะไรบางอย่างในโปรเจ็กต์ของฉันที่เปลี่ยนแปลงไประหว่างทาง ฉันสงสัยว่าฉันต้องเริ่มจากตรงไหนเพื่อแก้ไขปัญหานี้? ฉันได้พยายามแสดงความคิดเห็นเกือบทุกอย่างในของฉันStartup.csและProgram.csไม่มีความละเอียด


ฉันพบ MissingMethodException เดียวกันกับที่คุณกล่าวไว้ด้านล่าง ... คุณเคยคิดออกหรือไม่? ถ้างั้นช่วยตอบคำถามหน่อยได้ไหม
IEnjoyEatingVegetables

สำหรับใช้กับ Rider และ / หรือ Razor Class Libraries (RCL) ดูคำตอบนี้
Uwe Keim

คำตอบ:


68

ดูเหมือนว่ามีการเปลี่ยนแปลงใน ASP.NET Core 2.2 (และฉันไม่พบประกาศใด ๆ เกี่ยวกับการเปลี่ยนแปลงนี้) หากคุณไม่ได้ทำงานอย่างชัดเจนในสภาพแวดล้อม "การพัฒนา" ระบบจะรวบรวมมุมมอง Razor และคุณจะไม่เห็นการเปลี่ยนแปลงใด ๆ ที่เกิดขึ้นกับ. cshtml

อย่างไรก็ตามคุณสามารถปิดได้โดยใช้ config บางอย่างในคลาส Startup ของคุณดังนี้

services.AddMvc().AddRazorOptions(options => options.AllowRecompilingViewsOnFileChange = true);

สำหรับ ASP.NET หลัก 3.0 และสูงกว่าเห็นอเล็กซานเด Christov ของคำตอบ


2
ขอขอบคุณ. อย่างไรก็ตามดูเหมือนว่าเมื่อฉันเปิดใช้งานสิ่งนี้ทำการเปลี่ยนแปลงใน html แล้วรีเฟรชฉันได้รับข้อยกเว้นดังต่อไปนี้: มี MissingMethodException: Method not found: 'Microsoft.Cci.IMethodReference Microsoft.Cci.ICustomAttribute.Constructor(Microsoft.CodeAnalysis.Emit.EmitContext)'. Microsoft.CodeAnalysis.CSharp.Symbol.Microsoft.CodeAnalysis.ISymbol.GetAttributes() ความคิดเกี่ยวกับความหมายของข้อยกเว้นนี้หรือไม่ หน้าอื่น ๆ ทั้งหมดโหลดได้ดี เฉพาะเมื่อฉันแก้ไขไฟล์และรีเฟรชฉันจะได้รับข้อผิดพลาดนี้
kevskree

3
สิ่งนี้ได้ผลสำหรับฉัน ในการตั้งค่าขึ้นอยู่กับสภาพแวดล้อมให้เพิ่ม IHostingEnvironment ในวิธีการเริ่มต้นและคงอยู่ในคุณสมบัติ จากนั้นใช้สิ่งที่ชอบservices.AddMvc().AddRazorOptions(options => options.AllowRecompilingViewsOnFileChange = _env.IsEnvironment("MyEnvironment"));
KuriosCurious

1
ขอบคุณที่ใช้งานได้ อย่างไรก็ตามฉันคิดว่ามันค่อนข้างน่าอึดอัดและไร้สาระที่ Microsoft ไม่ได้ประกาศการเปลี่ยนแปลงครั้งใหญ่เช่นนี้
Code_Worm

@kevskree สิ่งเดียวกันกำลังเกิดขึ้นกับฉัน
IEnjoyEatingVegetables

1
@ Mayank Gupta: ดูคำตอบของ Alexander Christov ด้านล่าง ( stackoverflow.com/a/57637903/198990 ) คำตอบของเขาได้ผลสำหรับฉัน (3.1)
Sandor Drieënhuizen

236

ในASP.NET Core 3.0 ขึ้นไปRazorViewEngineOptions.AllowRecompilingViewsOnFileChangeจะไม่มีให้ใช้งาน

แปลกใจที่การรีเฟรชมุมมองในขณะที่แอปกำลังทำงานไม่ได้ผลฉันค้นพบวิธีแก้ปัญหาต่อไปนี้:

  1. เพิ่มแพคเกจMicrosoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet ไปยังโครงการ
  2. เพิ่มสิ่งต่อไปนี้ในStartup.cs:

    services.AddControllersWithViews () AddRazorRuntimeCompilation () ;

นี่คือคำอธิบายแบบเต็มสำหรับผู้ที่อยากรู้อยากเห็น ...

HTH


1
สิ่งนี้ไม่ได้ผลสำหรับฉันไม่ว่าด้วยเหตุผลใดก็ตาม ฉันใช้ Mac ถ้านั่นสร้างความแตกต่าง
Nakul Tiruviluamala

@Nakul คุณใช้. net core เวอร์ชั่นอะไร?
Alexander Christov

8
สิ่งนี้ใช้งานได้ดีสำหรับฉันบน Mac และ ASP.NET Core 3.1
user3071284

4
ขอบคุณสำหรับคำใบ้นี้ ทำงานให้ฉันบน. Net Core 3.1.2
jawa

4
ว้าว! 15 ปีที่ทำงานใน. NET และเคยเป็นเรื่องง่าย 1 วันทำงานกับ. NET Core และทุกอย่างดูเหมือนจะพัง และอย่างจริงจัง - ใครเป็นคนตัดสินใจว่าเป็นความคิดที่ดีที่จะทำให้ HTML คอมไพล์และไม่สามารถเปลี่ยนแปลงได้ในรันไทม์ตามค่าเริ่มต้นจากนั้นให้นักพัฒนาค้นหาวิธีแก้ปัญหา
Jason Snelders

54

ฉันเพิ่งสร้างโปรเจ็กต์ใหม่โดยใช้เทมเพลต ASP.NET MVC Core 3.1 ล่าสุดและฉันได้แก้ไขสิ่งต่อไปนี้เพื่อเปิดใช้งานการคอมไพล์ใหม่รันไทม์สำหรับ Debug:

แพคเกจการอ้างอิง NuGet - Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

Startup.cs - ConfigureServices (บริการ IServiceCollection) WAS:

// stuff...

services.AddControllersWithViews();

// more stuff...

ตอนนี้:

// stuff...

var mvcBuilder = services.AddControllersWithViews();

#if DEBUG
    mvcBuilder.AddRazorRuntimeCompilation();
#endif

// more stuff...

2
นี่เป็นคำตอบที่ดีที่สุดโดยไม่ต้องอ่านบทความที่โพสต์โดย Alex ซึ่งคุ้มค่ากับการอ่าน
Waragi

10

คุณควรเพิ่มสิ่งนี้:

services.AddControllersWithViews();

ไปที่วิธีConfigureService

โปรดทราบว่าโค้ดด้านล่างไม่มีใน ASP.NET Core 3.1:

services.AddControllersWithViews().AddRazorRuntimeCompilation();

7
คุณต้องติดตั้งแพ็คเกจ nuget เพื่อให้มันใช้งานได้ Microsoft.AspNetCore.Mvc.Razor.Runtime
Mayank Gupta

5

ด้านล่างนี้ช่วยฉันได้เมื่อมีการดูในโครงการแยกต่างหาก

if(HostingEnvironment.IsDevelopment()){ // only in development (optional)
    services.AddMvc().AddRazorOptions(o => {
        o.FileProviders.Add(new PhysicalFileProvider(PATH_TO_PROJECT));
    });
}

1
นี่เป็นคำตอบเดียวที่ใช้ได้ผลสำหรับฉันเมื่อทำงานกับ Razor Class Libraries ไชโย!
Sipke Schoorstra


1

ฉันสามารถแก้ปัญหานี้ใน Rider ได้โดยการเพิ่มASPNETCORE_ENVIRONMENT=Developmentตัวแปรสภาพแวดล้อม


1

มีสองวิธีในการแก้ไขปัญหานี้:

1 . ตรวจสอบสิทธิ์ของโฟลเดอร์ที่มีไฟล์. sln ของคุณอยู่อาจมีปัญหาเกี่ยวกับสิทธิ์การเข้าถึงไฟล์เนื่องจาก Visual studio อาจไม่สามารถเข้าถึงไฟล์ได้เมื่อเซิร์ฟเวอร์ IIS express กำลังทำงานอยู่ดังนั้นเพื่อให้สอดคล้องกับการเปลี่ยนแปลง. chtml ใหม่ทุกครั้งที่คุณต้องการ รีสตาร์ทเซิร์ฟเวอร์ดังนั้นฉันขอแนะนำให้แก้ไขสิทธิ์การเข้าถึงโฟลเดอร์โดย:

คลิกขวาที่โฟลเดอร์> Properties-> การรักษาความปลอดภัย> คลิกที่ปุ่มแก้ไข -> ตรวจสอบ Options-

รีสตาร์ท Visual Studio เพื่อดูการเปลี่ยนแปลง

หากไม่ได้ผลให้ใช้ 2 ตัวเลือก

2.ในโครงการของคุณในไฟล์startup.cs ให้เพิ่มบรรทัดด้านล่างConfigureServices ()ในวิธีการ:

services.AddMvc (). AddRazorOptions (ตัวเลือก => options.A allowRecompilingViewsOnFileChange = true);


1

สำหรับผู้ที่ใช้ Net core 3.0 หรือสูงกว่า

  1. ไปที่ Tools → Nuget package manager →จัดการ nuget pakages สำหรับวิธีแก้ปัญหา

  2. ย้ายไปที่แท็บเรียกดูเพื่อเรียกดูจากอินเทอร์เน็ต

  3. ค้นหา RuntimeCompilation คลิกที่ Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

  4. ติดตั้งในโครงการที่คุณต้องการซึ่งเป็นเวอร์ชันเสถียรในปัจจุบัน

  5. เปิดไฟล์ Startup.cs

  6. ไปที่วิธีโมฆะ ConfigureServices

  7. แอดไลน์: services.AddControllersWithViews().AddRazorRuntimeCompilation();

  8. คุณทำเสร็จแล้ว

รีรันและดู ตอนนี้คุณสามารถรีเฟรชมุมมองหรือเพจของคุณได้


0

คุณแน่ใจจริงๆหรือว่าใช้ 2.2? ตรวจสอบ csproj ของคุณเพราะอาจเป็นข้อผิดพลาดนี้https://github.com/aspnet/Razor/issues/2466 คุณสามารถลองปิดRazorCompileOnBuildข้อมูลเพิ่มเติมhttps://docs.microsoft.com/en-us/aspnet/core/razor -pages / sdk? view = คุณสมบัติ aspnetcore-2.1 #

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.