Страница .NET Core MVC не обновляется после изменений

118

Я создаю .NET Core MVC на последней версии 2.2. У меня проблема, когда я вношу изменения в файл CSHTML и обновляю страницу, мои изменения не отражаются в браузере. Мне нужно перезапустить проект, чтобы увидеть мои изменения. Это происходит уже некоторое время, поэтому я не совсем уверен, какое изменение вызвало эту проблему.

Я пробовал использовать Chrome «Пустой кеш и жесткая перезагрузка», а также другие браузеры, но безрезультатно. Это происходит в Windows и Mac с использованием Visual Studio для Mac и VS Code.

В проекте .Net Core по умолчанию он работает нормально, поэтому в моем проекте должно быть что-то, что изменилось в процессе. Мне интересно, с чего мне начать, чтобы отладить эту проблему? Я пробовал закомментировать почти все в моем Startup.csи Program.csбез разрешения.

Kevskree
источник
Я сталкиваюсь с тем же исключением MissingMethodException, которое вы упомянули ниже ... Вы когда-нибудь понимали это? Если так, не могли бы вы ответить на свой вопрос?
JohnOsborne

Ответы:

63

Похоже, что в ASP.NET Core 2.2 было внесено изменение (и я не могу найти никаких объявлений об этом изменении). Если вы явно не работаете в среде «Разработка», тогда представления Razor компилируются, и вы не увидите никаких изменений, внесенных в .cshtml.

Однако вы можете отключить это, используя некоторую конфигурацию в своем классе запуска следующим образом.

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

Для ASP.NET Core 3.0 и выше см. Ответ Александра Христова .

Крис Эйчисон
источник
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 в метод Startup и сохраните его в свойстве. Тогда используйте что-нибудь вродеservices.AddMvc().AddRazorOptions(options => options.AllowRecompilingViewsOnFileChange = _env.IsEnvironment("MyEnvironment"));
KuriosCurious
1
спасибо, это сработало. Однако я думаю, что это довольно неловко и глупо, что Microsoft официально не объявляет о таких больших изменениях.
Code_Worm
@kevskree то же самое происходит и со мной
JohnOsborne
1
@Mayank Gupta: см. Ответ Александра Христова ниже ( stackoverflow.com/a/57637903/198990 ). Его ответ сработал для меня (3.1).
Sandor Drieënhuizen
225

В ASP.NET 3.0 ядра и выше , RazorViewEngineOptions.AllowRecompilingViewsOnFileChangeне имеется.

Удивившись, что обновление представления во время работы приложения не помогло, я обнаружил следующее решение:

  1. Добавить в проект пакет NuGet Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
  2. Добавьте следующее Startup.cs:

    services.AddControllersWithViews (). AddRazorRuntimeCompilation () ;

Вот полное объяснение любопытных ...

HTH

Александр Христов
источник
1
У меня это не сработало по какой-то причине. Я использую Mac, если это имеет значение.
Накул Тирувилуамала
@ Накуль, какую версию ядра .net вы используете?
Александр Христов
7
У меня это отлично сработало на Mac и ASP.NET Core 3.1.
user3071284
4
Спасибо за подсказку; работал у меня на .Net Core 3.1.2
jawa
2
Ваузеры! 15 лет работы в .NET, и раньше это было легко. 1 день работы с .NET Core, и все кажется сломанным. А если серьезно - кто решил, что это хорошая идея сделать HTML скомпилированным и неизменяемым во время выполнения по умолчанию, а затем заставить разработчиков искать решение?
Джейсон Снелдерс
54

Я только что создал новый проект, используя последний шаблон ASP.NET MVC Core 3.1, и изменил следующее, чтобы включить перекомпиляцию среды выполнения для отладки:

Эталонный пакет NuGet - Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation .

Startup.cs - ConfigureServices (службы IServiceCollection) БЫЛ:

// stuff...

services.AddControllersWithViews();

// more stuff...

СЕЙЧАС ЖЕ:

// stuff...

var mvcBuilder = services.AddControllersWithViews();

#if DEBUG
    mvcBuilder.AddRazorRuntimeCompilation();
#endif

// more stuff...
Иеремия Н.
источник
2
Это лучший ответ, не читая статью Алексея, которую стоит прочитать.
Вараги,
10

Вам нужно просто добавить это:

services.AddControllersWithViews();

в метод ConfigureService .

Имейте в виду, что приведенный ниже код недоступен в ASP.NET Core 3.1:

services.AddControllersWithViews().AddRazorRuntimeCompilation();
Алиреза Абдоллахнеджад
источник
7
Вам необходимо установить пакет nuget, чтобы он заработал Microsoft.AspNetCore.Mvc.Razor.Runtime
Майанк Гупта,
5

Ниже мне помогло, когда просмотры были в отдельном проекте.

if(HostingEnvironment.IsDevelopment()){ // only in development (optional)
    services.AddMvc().AddRazorOptions(o => {
        o.FileProviders.Add(new PhysicalFileProvider(PATH_TO_PROJECT));
    });
}
дым
источник
1
Это единственный ответ, который у меня сработал при работе с библиотеками классов Razor. Ура!
Сипка Schoorstra
3

Используя запущенное приложение .net core 2.2 с командой, dotnet watch runпроект перезапускается после каждого изменения

Нанкуим
источник
1

Мне удалось решить эту проблему в Rider, добавив ASPNETCORE_ENVIRONMENT=Developmentпеременную окружения.

user1613512
источник
1

Для тех, кто использует Net Core 3.0 или выше

  1. Перейдите в Инструменты → Диспетчер пакетов Nuget → Управление пакетами nuget для решения.

  2. перейти на вкладку просмотра для просмотра из Интернета

  3. поиск RuntimeCompilation Щелкните Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

  4. установите его на ваши предполагаемые проекты текущую стабильную версию

  5. открыть файл Startup.cs

  6. перейти к недействительному методу ConfigureServices

  7. добавить строку: services.AddControllersWithViews().AddRazorRuntimeCompilation();

  8. вы сделали

Повторите попытку и посмотрите. Теперь вы можете обновить свои просмотры или страницы.

ГераГамо
источник
0

Есть два способа решить эту проблему:

1 . Проверьте права доступа к папке, в которой находится ваш .sln-файл. Может возникнуть проблема с разрешениями на доступ к файлам, поскольку Visual Studio может не иметь доступа к файлам при запущенном сервере IIS Express, поэтому для отражения новых изменений .cshtml каждый раз, когда вам нужно перезапустите сервер, поэтому я предлагаю отредактировать права доступа к папке:

Щелкните правой кнопкой мыши папку-> свойства-> безопасность-> нажмите кнопку редактирования -> проверьте все параметры-> сохранить .

Перезапустите Visual Studio, чтобы увидеть изменения.

Если это не работает, используйте 2 варианта.

2. В вашем проекте в файле startup.cs добавьте следующую строку ConfigureServices () в методе:

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

Омкар Невасе
источник