【问题标题】:MVC can't find Views after converting to ASPNET Core 3.1转换为 ASPNET Core 3.1 后 MVC 找不到视图
【发布时间】:2022-02-23 15:48:47
【问题描述】:

我们正在将 MVC/Angular 网站从 ASPNET Core 2.2 转换为 ASPNET Core 3.1。我已经让构建运行而没有错误或警告,但是当它启动时(在 Visual Studio 2019 中),它会查找 Home/Index,找到控制器正常,并查找 Home/Index 视图,但它无法找到它,即使它在那里(在 Views/Home/Index.cshtml 中),就在它应该在的地方(并且就在我们开发这个网站的几个月里它一直在的地方。我现在把它简化为一个测试如果我可以将 web 项目文件设置为 netcoreapp2.2 并且站点运行正常,然后停止它并将其更改为 netcoreapp3.1,没有其他更改,它会失败。错误正是您所期望的文件失踪了:

System.InvalidOperationException:未找到视图“索引”。搜索了以下位置:

/Views/Home/Index.cshtml

/Views/Shared/Index.cshtml

/Pages/Shared/Index.cshtml

但是文件在那里!我完全迷惑了。

谁能告诉我发生了什么?

谢谢。

【问题讨论】:

  • 能否请您出示您的Startup 和相关代码/迁移?
  • 你必须在启动时指定。配置服务:services.AddControllersWithViews();然后在配置中: .app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute();});类似的东西,或者你需要的任何设置。
  • John,我在 services.AddMvc 调用中使用了 EnableEndpointRouting=false 选项。我试图从 2.2 中进行最小的更改。如果我没有这样做或没有进行您建议的更改,我会得到一个 InvalidOp 异常,而不是缺少视图。但是,作为记录,我也尝试了您建议的更改,结果相同 - 网站运行,但找不到视图,即使它在那里。
  • itminus,我很欣赏 Startup 可能是相关的,但出于安全考虑,我禁止上传代码。问题是该启动在 2.2 中运行良好,当我将项目框架更改为 netcoreapp3.1 时无法运行。如果有关于这家初创公司的具体情况,我或许可以回答。

标签: c# asp.net-core asp.net-core-mvc


【解决方案1】:

我们刚刚遇到了与局部视图类似的问题:将 Web 应用程序从核心 2.2 升级到 3.1 后,无法找到局部视图。我们的解决方案是替换这个......

services.AddMvc();

...与...

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

虽然我相信 .AddMvc() 等同于 .AddControllersWithViews() 加上 .AddRazorPages 它不包括开箱即用的运行时编译部分。

【讨论】:

    【解决方案2】:

    查看关于路由调整的部分 - 见Migrate from ASP.NET Core 2.2 to 3.0

    您很可能需要在 Startup 类中更改此设置:

    app.UseMvc(routes =>
        {
            routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
        });
    

    这样:

    app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
        });
    

    【讨论】:

      【解决方案3】:

      替换

      `app.UseMvc(routes =>
              {
                  routes.MapRoute(
                     name: "areas",
                    template: "{area=User}/{controller=Home}/{action=Index}/{id?}");
              });`
      

      `app.UseEndpoints(endpoints =>
              {
                  endpoints.MapControllerRoute(
                      name: "default",
                      pattern: "{controller=Home}/{action=Index}/{id?}");
                  endpoints.MapRazorPages();
              });`
      

      在从 .Net Core 2 迁移到 .Net Core 3 时,他们将 app.UseMvc 替换为 app.UseEndponts

      如果您有另一个 Views 文件夹,请将现有 Views 文件夹中的 _ViewImports.cshtml_ViewStart.cshtml 复制到其他 Views 文件夹。

      【讨论】:

        【解决方案4】:

        我有同样的问题。

        对我来说,在项目文件中是这样的:

        <RazorCompileOnBuild>false</RazorCompileOnBuild>
        <RazorCompileOnPublish>false</RazorCompileOnPublish>
        

        我不得不删除它。

        【讨论】:

          【解决方案5】:

          首先,你必须安装包Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

          install-package Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation
          

          然后在startup.cs中的services.AddControllersWithViews()行之后添加AddRazorRuntimeCompilation()

          services.AddControllersWithViews().AddRazorRuntimeCompilation();
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-01-30
            • 2020-05-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-11
            • 1970-01-01
            相关资源
            最近更新 更多