如何解决ASP.NET Core MVC项目中的“视图未找到”异常

65
我正在尝试使用VS Code在OSX上创建一个运行ASP.NET Core MVC测试应用程序。 当访问默认的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 --- ...

有什么建议是我可能忽略了的吗?


请展示一下你的HomeController代码。 - Lukasz Mk
1
检查文件名 -> index.cshtml -> Index.cshtml - Lukasz Mk
1
将视图从项目中排除,然后再次包含即可解决问题!!! - Nima Talebi
@NimaTalebi 的解决方案对我很有帮助! - Kevin Dark
33个回答

70

在我的情况下,生成操作不知何故更改为嵌入式资源,而此类资源不包括在发布的文件中。

嵌入式资源 更改为 内容 可解决我的问题。

输入图像描述


9
我有一个相关的问题。当我第一次创建那个文件时,我输入了错误的扩展名。因此,Visual Studio将构建操作设置为“无”。在本地调试时,这个问题似乎没有影响,但是当项目发布到线上(使用WebDeploy或从包中运行)时,视图不会被构建,并且在运行时找不到它。 - Renaud Dumont
2
是的!我遇到了ViewComponent视图无法找到的问题,因为cshtml文件的构建操作标记为None。我使用“添加新文件”VS插件创建了这些文件,显然没有正确设置文件属性。 - A. Murray

21

我发现了这个缺失的部分。最终我在VS2015中创建了一个ASP.NET Core项目,然后进行比较以寻找差异。结果发现我在主要部分的WebHostBuilder中缺失了.UseContentRoot(Directory.GetCurrentDirectory())

添加了这个之后:

public static void Main(string[] args)
{
    new WebHostBuilder()
        .UseKestrel()
        .UseContentRoot(Directory.GetCurrentDirectory())
        .UseStartup<Startup>()
        .Build()
        .Run();
}

然后我收到了有关缺少preserveCompilationContext的异常。一旦在project.json中添加,我的视图就显示正确。

"buildOptions": {
    "preserveCompilationContext": true,
    "emitEntryPoint": true
},

4
在Ubuntu 16.04中,某些情况下调用Directory.GetCurrentDirectory()会返回简单的"/"。请改用来自命名空间Microsoft.Extensions.PlatformAbstractionsPlatformServices.Default.Application.ApplicationBasePath以获得跨平台支持。 - NucS

21

我刚从.NET Core 2.2升级到了3。我发现两种解决方法:

一种方法是在配置MVC时调用AddRazorRuntimeCompilation(),例如:

services.AddControllersWithViews()
    .AddRazorRuntimeCompilation(...);

更多信息请参见:https://learn.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>

1
这对2.2到3.1.2的升级也适用。谢谢! - jaybro
最近安装了 .NET 8 SDK,结果导致在 VS 2022 17.7.4 中旧项目出现了问题。添加这个解决了我的问题。 - undefined

21

检查你的.csproj文件,确保你的文件没有像这样列出:

<ItemGroup>
   <Content Remove="Views\Extractor\Insert.cshtml" />
   <Content Remove="Views\_ViewImports.cshtml" />
</ItemGroup>
如果像上面那样列出来,就删除你需要的选项。 有时,在右键单击并将构建设置更改为编译时会发生这种情况。

哇,那就是问题所在。我不知道它是如何进入我的代码的。但是在将其移除之后,问题已经解决了。谢谢。 - SWIK
非常准确。建立了Home\Index。运行良好。建立了其他一些,所有“其他”都按照您所示设置为删除。一直在苦苦思索,直到我偶然发现这个。感谢您挽救了这一天。 - Manish Kumar

11

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


1
dotnet watch run also works using cmd - Nishan
谢谢,那个命令解决了我的问题。 - Brayan Aguilar
1
对我来说也一样(.net 7)。 - Hp93
升级从17.5.1到17.6.5也解决了我的问题。 - rudivonstaden
更新微软视觉工作室对我来说很有效。我之前也遇到了同样的问题。 - Asad ullah
对我们来说,在构建服务器上更新VS构建工具是有效的。这会导致在开发机器和构建服务器上运行相同的msbuild命令产生不同的结果。 - undefined

9
我的项目解决方案如下:
1- 在 StartUp ConfigureServices中添加services.AddControllersWithViews().AddRazorRuntimeCompilation();
2- 在 .csproj 文件中保留以下代码: <RazorCompileOnBuild>false</RazorCompileOnBuild>,然后编译项目。
更新:
确保将此 NuGet 包添加到您的项目中:
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

加入 Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation 这个库解决了我的问题。非常感谢! - brando
也适用于我。在我的情况下,这是通过.NET升级助手运行Framework 4.6.2项目的结果。看起来工具忽略了这个要求。 - Tom W

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

从:

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

to:

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

这个对我来说可以。另外,应用程序部分需要包括一个带有一些语句的Program.cs文件(例如{})。 - undefined

5

我需要在project.json中添加以下内容:

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

谢谢,伙计!现在我想一想就有意义了。 - Exocomp
是的,我漏掉了 "**/*.cshtml",现在它运行得很好! - LatentDenis

4
对于所有遇到此问题的人,我遇到的问题与上面所述的所有问题不同。 我本地版本工作正常,但是生产版本出现了这个错误。 结果发现Unix文件名与Windows中显示的文件名不同。
Git默认启用了一个讨厌的设置:core.ignorecasegit(您可以使用config --get core.ignorecase在命令行中检查此设置)
解决方法是将文件重命名为其他名称(例如xxx.cs),进行提交和推送,然后将它们重新命名回带有正确大小写/大写格式的原始名称,再次提交和推送。

4

我正在使用VS2017。在我的情况下,视图文件位于正确的位置(具有正确的名称)。然后我想起我之前已经重命名了它,但是 VS 没有像往常一样询问我是否要更改所有引用。所以最终我删除了该视图,然后重新创建它,这解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接