如何在asp.net核心mvc项目中解决"未查找视图"异常

Jes*_*sen 23 asp.net-core

我正在尝试使用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}"
            );
        });
    }
Run Code Online (Sandbox Code Playgroud)

我已经定义了视图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"
},
Run Code Online (Sandbox Code Playgroud)

最后,这是我得到的例外.

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 --- ...
Run Code Online (Sandbox Code Playgroud)

对我可能缺少什么的任何建议?

Jes*_*sen 13

我找到了这件丢失的作品.我最终在VS2015中创建了一个ASP.NET Core项目,然后比较差异.原来我是缺少.UseContentRoot(Directory.GetCurrentDirectory())来自WebHostBuilder主.

添加后:

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

然后我得到了关于失踪的例外preserveCompilationContext.在project.json中添加后,我的视图显示正确.

"buildOptions": {
    "preserveCompilationContext": true,
    "emitEntryPoint": true
},
Run Code Online (Sandbox Code Playgroud)

  • 在Ubuntu 16.04中,在某些情况下调用`Directory.GetCurrentDirectory()`会返回简单的`"/"`.使用`PlatformServices.Default.Application.ApplicationBasePath`代替命名空间`Microsoft.Extensions.PlatformAbstractions'的跨平台支持 (2认同)

Nir*_*edi 13

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

<ItemGroup>
   <Content Remove="Views\Extractor\Insert.cshtml" />
   <Content Remove="Views\_ViewImports.cshtml" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

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


小智 12

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

  • `dotnet watch run` 也可以使用 `cmd` (2认同)

Joh*_*Fun 10

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

AddRazorRuntimeCompilation()在配置 mvc 时调用,例如:

services.AddControllersWithViews()
    .AddRazorRuntimeCompilation(...);
Run Code Online (Sandbox Code Playgroud)

更多信息: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>
Run Code Online (Sandbox Code Playgroud)


Moh*_*d S 10

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

2-并保留这个 <RazorCompileOnBuild>false</RazorCompileOnBuild>

.csproj。然后构建项目。

更新

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

Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation


小智 8

在我的例子中,构建操作以某种方式更改为嵌入式资源,该资源未包含在已发布的文件中.

改变Embedded resourceContent解决我的问题.

在此输入图像描述

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

Maj*_*jid 6

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

从:

<Project Sdk="Microsoft.NET.Sdk">
Run Code Online (Sandbox Code Playgroud)

到:

<Project Sdk="Microsoft.NET.Sdk.Web">
Run Code Online (Sandbox Code Playgroud)


Ale*_*klo 5

我必须在 project.json 中添加:

"publishOptions": {
    "include": [
        "wwwroot",
        "**/*.cshtml",
        "appsettings.json",
        "web.config"
    ]
},
Run Code Online (Sandbox Code Playgroud)