Подтвердить что ты не робот

Как решить исключение "не найденное представление" в проекте 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 --- ...

Любые предложения о том, что мне может не хватать?

4b9b3361

Ответ 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

В моем случае это просто ошибка "забыть"...
У меня была папка с видом, не названная так же, как имя контроллера.
Переименовал папку в правильное имя.. и работает...