Как решить исключение "не найденное представление" в проекте asp.net core mvc
Я пытаюсь создать тестовое приложение ASP.NET Core MVC, работающее на OSX, используя VS Code.
Я получаю исключение "не найденное" при доступе к стандарту Home/index (или любым другим просмотрам, которые я пробовал).
Это конфигурация запуска
public void Configure(IApplicationBuilder app) {
// use for development
app.UseDeveloperExceptionPage();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseMvc( routes => {
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}"
);
});
}
И у меня есть представление, определенное в Views/Home/index.cshtml
, и у меня есть следующие пакеты, включенные в project.json
"dependencies": {
"Microsoft.NETCore.App": {
"version": "1.0.0-rc2-3002702",
"type": "platform"
},
"Microsoft.AspNetCore.Razor.Tools" : "1.0.0-preview1-final",
"Microsoft.AspNetCore.Diagnostics": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Mvc": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Server.IISIntegration": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0-rc2-final",
"Microsoft.AspNetCore.StaticFiles": "1.0.0-rc2-final",
"Microsoft.AspNetCore.Routing": "1.0.0-rc2-final"
},
И, наконец, это исключение, которое я получаю.
System.InvalidOperationException: The view 'Index' was not found. The following locations were searched:
/Views/Home/Index.cshtml
/Views/Shared/Index.cshtml
at Microsoft.AspNetCore.Mvc.ViewEngines.ViewEngineResult.EnsureSuccessful(IEnumerable`1 originalLocations)
at Microsoft.AspNetCore.Mvc.ViewResult.<ExecuteResultAsync>d__26.MoveNext()
--- End of stack trace from previous location where exception was thrown --- ...
Любые предложения о том, что мне может не хватать?
Ответы
Ответ 1
Я нашел этот недостающий кусок. Я закончил создание проекта ASP.NET Core в VS2015, а затем сравнил различия. Оказывается, я отсутствовал .UseContentRoot(Directory.GetCurrentDirectory())
от WebHostBuilder
в основном.
После добавления:
public static void Main(string[] args)
{
new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.Build()
.Run();
}
Затем я получил исключение из-за отсутствия preserveCompilationContext
. После добавления в project.json мое представление отображается правильно.
"buildOptions": {
"preserveCompilationContext": true,
"emitEntryPoint": true
},
Ответ 2
В моем случае действие по сборке было каким-то образом изменено на ресурс Embedded, который не включен в опубликованные файлы.
Изменение Embedded resource
на Content
решает мою проблему.
![enter image description here]()
Ответ 3
Мне нужно добавить в project.json следующее:
"publishOptions": {
"include": [
"wwwroot",
"**/*.cshtml",
"appsettings.json",
"web.config"
]
},
Ответ 4
Я использую VS2017. В моем случае был файл представления в нужном месте (с собственным именем). Затем я вспомнил, что раньше меня переименовал (и VS почему-то не спросил меня, хочу ли я менять все ссылки, как обычно). Поэтому я, наконец, удалил представление, затем я сделал это снова, и это решило мою проблему.
Ответ 5
У меня была такая же проблема при создании экземпляра Identity Server, все отлично работало, если я запускал проект из Visual Studio, но после публикации проекта и запуска с помощью команды dotnet
я получил ошибку "Просмотр не найден", когда Identity Сервер попытался отобразить вид входа в систему. Я уже проверил все, что упоминалось здесь, но он все еще не работал. Наконец я обнаружил, что проблема связана с тем, как я запускал команду dotnet
. Я запускал его из родительской папки на один уровень выше моего экземпляра Identity Server, и это повлияло на корневой путь содержимого, например, запустив этот
dotnet myWebFolder/MyIdentityServer.dll
дал мне следующий вывод, когда был запущен Identity Server:
![введите описание изображения здесь]()
Таким образом, полный путь к моей dll в этом случае - C:\inetpub\aspnetcore\myWebFolder\MyIdentityServer.dll, и я запустил команду dotnet
из папки C:\inetpub\aspnetcore \.
Чтобы получить правильный корневой контент, мне нужно было убедиться, что я запустил команду dotnet
из той же самой папки, где находится dll, как в "dotnet MyIdentityServer.dll". Это изменение дало мне этот результат:
![введите описание изображения здесь]()
Теперь мой корневой путь для контента верен, и Identity Server находит виды входа в C:\inetpub\aspnetcore\myWebFolder\Views\Account\Login.cshtml
Ответ 6
Ответ на @LukaszDev (не думаю, что я могу прикреплять изображения к комментарию)
Мой взгляд I ndex.cshtml, опечатка с моей стороны. См. Прилагаемый скриншот
![введите описание изображения здесь]()
Мой контроллер прост, как может быть. Я получаю ту же ошибку для индекса и приветствия
using Microsoft.AspNetCore.Mvc;
namespace app1 {
[Route("[controller]")]
public class HomeController : Controller {
// default action, configured in Startup.cs route
public IActionResult Index() {
// handles route /home
return View();
}
[Route("welcome")]
public IActionResult WelcomeActionDoesNotHaveToMatchName() {
// handles router /home/welcome
return View("Welcome");
}
}
}
Ответ 7
Для тех, кто борется с этим, у меня была другая проблема, чем все вышеперечисленное.
Моя локальная версия работала нормально, но в режиме реального времени эта ошибка. Оказалось, что имена файлов Unix отличаются от тех, которые отображаются в Windows.
Git имеет неприятную настройку, которая включена по умолчанию: core.ignorecasegit(вы можете проверить этот параметр в командной строке с помощью config --get core.ignorecase
)
Решение заключалось в том, чтобы переименовать файлы на что-то другое (например, xxx.cs), зафиксировать и нажать, а затем переименовать их обратно в оригинал с правильной оболочкой/капитализацией и зафиксировать и снова нажать.
Ответ 8
FWIW, в нашем случае мы получили эту ошибку при доступе к localhost:<port>/graphql
хотя View/GraphQL/Index.cshtml
был в нужном месте. Мы получили ошибку, потому что wwwroot/bundle.js
и wwwroot/style.js
ошибке не были изначально зафиксированы, так как наш .gitignore
включал wwwroot
. Обнаружил его, проверив сетевой трафик и увидев, что эти файлы дают 404, а не сам Index.cshtml
.
Ответ 9
Визуальный код с dotnet версии 2.2.300 выдает сообщение об ошибке, поэтому не исключение времени выполнения.
Мой контроллер был получен из ControlerBase вместо Controller. Итак, мне пришлось изменить ControllerBase на Controller.
Ответ 10
Я только что обновил .net core 2.2 до 3. Я нашел два способа решения:
Либо вызовите AddRazorRuntimeCompilation()
при настройке mvc, например:
services.AddControllersWithViews()
.AddRazorRuntimeCompilation(...);
больше информации здесь: https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#opt-in-to-runtime-compilation
Или удалите следующие строки из .csproj:
<RazorCompileOnBuild>false</RazorCompileOnBuild>
<RazorCompileOnPublish>false</RazorCompileOnPublish>
Ответ 11
Проверьте ваш .csproj файл. Убедитесь, что ваши файлы не указаны в списке:
<ItemGroup>
<Content Remove="Views\Extractor\Insert.cshtml" />
<Content Remove="Views\_ViewImports.cshtml" />
</ItemGroup>
Если он указан выше, удалите те, которые вам нужны.
Иногда это происходит, когда мы делаем правый клик и меняем настройку сборки на Compile.
Ответ 12
В моем случае это просто ошибка "забыть"...
У меня была папка с видом, не названная так же, как имя контроллера.
Переименовал папку в правильное имя.. и работает...