【问题标题】:How do I solve a "view not found" exception in asp.net core mvc project如何解决 asp.net core mvc 项目中的“未找到视图”异常
【发布时间】:2022-04-30 15:42:55
【问题描述】:

我正在尝试使用 VS Code 创建一个在 OSX 上运行的 ASP.NET Core MVC 测试应用程序。 访问默认主页/索引(或我尝试过的任何其他视图)时,我收到“未找到视图”异常。

这是启动配置

    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 --- ...

关于我可能遗漏的任何建议?

【问题讨论】:

  • 请向我们展示您的 HomeController 中的代码。
  • 并检查文件名 -> index.cshtml -> Index.cshtml
  • 我排除了视图并再次包含在项目中并解决了问题!!!

标签: c# asp.net-core


【解决方案1】:

在我的例子中,构建操作以某种方式更改为 Embedded resource,它不包含在已发布的文件中。

将Embedded resource 更改为Content 解决了我的问题。

【讨论】:

  • 我遇到了相关问题。当我第一次创建文件时,它键入了错误的扩展名。因此,Visual Studio 将 Build Action 设置为 None。这在本地调试中正常工作,但是当项目在线发布(webdeploy 或从包运行)时,视图不是构建的一部分,因此在运行时找不到。
  • 是的!这是我无法找到 ViewComponent 视图的问题,cshtml 文件被标记为 Build Action = None。我使用“添加新文件”VS 插件创建了文件,其中 obvs 没有正确设置文件属性。
【解决方案2】:

我找到了这个缺失的部分。我最终在 VS2015 中创建了一个 ASP.NET Core 项目,然后比较差异。原来我在 main 中缺少 .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
},

【讨论】:

  • 在 Ubuntu 16.04 中,在某些情况下调用 Directory.GetCurrentDirectory() 会返回简单的 "/"。使用 PlatformServices.Default.Application.ApplicationBasePath 代替命名空间 Microsoft.Extensions.PlatformAbstractions 的跨平台支持
【解决方案3】:

检查您的 .csproj 文件。确保您的文件未列出如下:

<ItemGroup>
   <Content Remove="Views\Extractor\Insert.cshtml" />
   <Content Remove="Views\_ViewImports.cshtml" />
</ItemGroup>

如果上面列出了,请删除您需要的。 有时,当我们右键单击并将构建设置更改为编译时会发生这种情况。

【讨论】:

  • 哇,这就是问题所在。不知道它是如何出现在我的代码中的。但是去掉之后。解决了。谢谢
  • 正确。建家\索引。工作得很好。建立了一些其他的,所有“其他”都设置为删除,如您所示。一直挠头,直到我偶然发现了这一点。感谢您拯救了这一天。
【解决方案4】:

我刚刚从.net core 2.2升级到3。我找到了两种解决方法:

配置mvc的时候要么调用AddRazorRuntimeCompilation(),比如:

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>

【讨论】:

  • 这也适用于 2.2 到 3.1.2 的升级。谢谢!
【解决方案5】:

我必须在 project.json 中添加这个:

"publishOptions": {
    "include": [
        "wwwroot",
        "**/*.cshtml",
        "appsettings.json",
        "web.config"
    ]
},

【讨论】:

  • 谢谢老兄!现在想想就明白了。
  • 是的,我错过了"**/*.cshtml",,现在它运行良好!
【解决方案6】:

我的项目的解决方案是由
1-添加 AddRazorRuntimeCompilation() 例如 services.AddControllersWithViews().AddRazorRuntimeCompilation(); 变成 StartUp ConfigureServices。

2- 并保留此&lt;RazorCompileOnBuild&gt;false&lt;/RazorCompileOnBuild&gt;

在.csproj 中。 然后构建项目。

更新

确保您已将此 NuGet 包添加到您的项目中:

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

【讨论】:

  • 添加 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 为我修复了它。非常感谢!
  • 也为我工作。在我的例子中,这是通过 .NET 升级助手运行 Framework 4.6.2 项目的结果。该工具似乎没有满足此要求。
【解决方案7】:

对于任何为此苦苦挣扎的人,我遇到的问题与上述所有问题不同。 我的本地版本运行良好,但现场制作版本出现此错误。结果发现 Unix 文件名与 Windows 中显示的不同。

Git 有一个默认启用的讨厌设置:core.ignorecasegit(您可以在命令行中使用config --get core.ignorecase 检查此设置)

解决方案是将文件重命名为其他名称(例如 xxx.cs ),提交并推送,然后使用正确的大小写/大写将它们重命名为原始文件,然后再次提交并推送。

【讨论】:

    【解决方案8】:

    我正在使用 VS2017。就我而言,视图文件位于正确的位置(具有正确的名称)。然后我记得我之前重命名了它,(并且 VS 不知何故没有问我是否想像往常一样更改所有引用)。所以我最终删除了视图,然后我再次创建了它,这解决了我的问题。

    【讨论】:

      【解决方案9】:

      我在 ASP.Net Core MVC (.Net 6) 中遇到了同样的问题。我只是将我的 Visual Studio 2022 更新到最新版本 17.1.0 并解决了错误。

      【讨论】:

      • dotnet watch run 也可以使用cmd
      【解决方案10】:

      如果您要将项目从控制台应用程序移植到 Web 应用程序,则需要在 .csproj 文件中更改此行

      来自:

      <Project Sdk="Microsoft.NET.Sdk">
      

      到:

      <Project Sdk="Microsoft.NET.Sdk.Web">
      

      【讨论】:

        【解决方案11】:

        从 .net 2.2 迁移到 6 后,我开始遇到同样的问题。 在本地它很好,但只有部署的版本给出了The view 'Index' was not found 错误。

        事实证明,构建管道中的 windows-latest 和 latest Visual Studio 实际上并不意味着 Windows 2022 和 Visual Studio 2022。因此发布的版本不支持 .net 6。

        在为 Windows 和 Visual Studio 指定 2022 版本后,它开始工作。

        这是参考:https://github.com/dotnet/core/issues/6907

        【讨论】:

          【解决方案12】:

          我在构建 Identity Server 实例时遇到了同样的问题,如果我从 Visual Studio 运行项目,一切都很好,但是在发布项目并使用 dotnet 命令运行后,我在 Identity 时收到“未找到视图”错误服务器试图提供登录视图。我已经验证了这里提到的所有其他内容,但它仍然无法正常工作。我终于发现问题出在我运行dotnet 命令的方式上。我从父文件夹运行它,比我的 Identity Server 实例高一级,这影响了内容根路径,例如,运行这个:

          dotnet myWebFolder/MyIdentityServer.dll
          

          Identity Server 启动时给了我以下输出:

          因此,在这种情况下,我的 dll 的完整路径是 C:\inetpub\aspnetcore\myWebFolder\MyIdentityServer.dll,我从 C:\inetpub\aspnetcore\ 文件夹运行了 dotnet 命令。

          要获得正确的内容根目录,我必须确保从 dll 所在的同一文件夹运行 dotnet 命令,如 dotnet MyIdentityServer.dll。这种变化给了我这个输出:

          现在我的内容根路径是正确的,Identity Server 在C:\inetpub\aspnetcore\myWebFolder\Views\Account\Login.cshtml 找到登录视图

          【讨论】:

            【解决方案13】:

            使用 dotnet 版本 2.2.300 的可视代码给出了错误消息,因此不是运行时异常。

            我的控制器是从 ControllerBase 而不是 Controller 派生的。因此,我不得不将 ControllerBase 更改为 Controller。

            【讨论】:

              【解决方案14】:

              FWIW,在我们的例子中,我们在访问 localhost:&lt;port&gt;/graphql 时收到此错误,即使 View/GraphQL/Index.cshtml 位于正确的位置。我们收到错误是因为wwwroot/bundle.js 和wwwroot/style.js 最初没有被错误地提交,因为我们的.gitignore 包括wwwroot。通过检查网络流量发现了它,发现是这些文件给出了 404 而不是 Index.cshtml 本身。

              【讨论】:

                【解决方案15】:

                我的情况只是一个“忘记”错误...
                我的文件夹名称与控制器名称不同。
                将文件夹重命名为正确的名称......并且工作......

                【讨论】:

                  【解决方案16】:

                  我也遇到了类似的错误。我正在使用 .Net Core 6.0 ASP .Net MVC 项目。

                  只需在program.cs中添加以下内容即可解决

                  builder.Services.AddRazorPages().AddRazorRuntimeCompilation();
                  

                  您需要在项目文件中添加以下包引用

                  <ItemGroup>
                      <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.3" />
                  </ItemGroup>
                  

                  【讨论】:

                    【解决方案17】:

                    回复@LukaszDev(不要以为我可以在评论中附加图片) 我的观点是 Index.cshtml,我这边的错字。见附件截图

                    我的控制器尽可能简单。 Index 和 Welcome 都出现同样的错误

                    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"); 
                            }
                        }
                    }
                    

                    【讨论】:

                      【解决方案18】:

                      在我的情况下,问题来自我在我的 csproj 中设置的 &lt;EnableDefaultContentItems&gt;false&lt;/EnableDefaultContentItems&gt;

                      【讨论】:

                        【解决方案19】:

                        如果有人遇到类似问题。 事实证明,我的 csproj 文件对我的视图有一些无效的引用。 我删除了与我的视图相关的所有记录,我从项目目录中删除了 csproj.user 文件并重新加载了项目,然后我包含了我的视图。事情开始了。

                        【讨论】:

                          【解决方案20】:

                          我在 Arch Linux、Visual Studio Code 和 .NET Core 3.1 和 5.0 下遇到了同样的问题。

                          我通过删除 tasks.json 文件的构建部分中的 csproj 文件的路径解决了这个问题:

                          "tasks": [
                              {
                                  "label": "build",
                                  "command": "dotnet",
                                  "type": "process",
                                  "args": [
                                      "build",
                                      // removed the following line:
                                      // "${workspaceFolder}/ProjectFoo.csproj",
                                      "/property:GenerateFullPaths=true",
                                      "/consoleloggerparameters:NoSummary"
                                  ],
                                  "problemMatcher": "$msCompile"
                              },
                          

                          【讨论】:

                            【解决方案21】:

                            在我从 Core 2.2 迁移到 3.1 之后,我的静态 html 文件没有找到。在我的 startup.cs 文件中,我必须在 app.UseStaticFiles() 之前添加 app.UseDefaultFiles() 才能使其工作。所以是这样的:

                            public void ConfigureServices(IServiceCollection services)
                            {
                               .
                               .
                               .
                               services.AddControllersWithViews();
                               .
                               .
                               .
                            }
                            
                            
                            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
                            {
                               .
                               .
                               .
                               app.UseDefaultFiles();
                               app.UseStaticFiles();
                               app.UseRouting();
                               .
                               .
                               .
                               app.UseEndpoints(endpoints =>
                               {
                                      endpoints.MapControllerRoute(
                                      name: "default",
                                      pattern: "{controller=Home}/{action=Index}/{id?}");
                               });
                            }
                            

                            【讨论】:

                              【解决方案22】:

                              我在 Ubuntu Linux 上遇到了这个错误,并且第一次尝试从 CLI 运行它,所以我通过使用sudo dotnet build 运行 dotnet build 命令来修复它,所以它原来是一个权限问题并且应用程序以dotnet bin/Debug/netcoreapp2.0/MyApp.dll 开始。遗憾的是,构建命令没有通知权限问题。

                              【讨论】:

                                【解决方案23】:

                                如果有人在 VS 2022 创建新的 MVC ASP.NET 项目时遇到这个问题,我不得不执行

                                dotrun watch run 和 Debug 视觉工作室项目。问题消失了。

                                我不知道为什么 dotrun 在调试模式下默认不启动。

                                【讨论】:

                                  【解决方案24】:

                                  为现有项目中的所有环境启用运行时编译:

                                  1. 安装 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation NuGet 包。 安装包 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

                                  2. 更新项目的 Startup.ConfigureServices 方法以包含对 AddRazorRuntimeCompilation 的调用。 builder.Services.AddRazorPages().AddRazorRuntimeCompilation();

                                  【讨论】:

                                    猜你喜欢
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 2020-10-17
                                    • 1970-01-01
                                    • 2021-08-11
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    • 1970-01-01
                                    相关资源
                                    最近更新 更多