如何使Asp.Net Core返回正确的视图

问题描述

我的Asp.Net Core项目的安排如下:

MyApp
--Folder1
  Folder1Controller.cs
  Index.cshtml
--Folder2
  Folder2Controller.cs
  Index.cshtml
--Views
  Shared
  etc..

我更改了启动方式,以便它知道此目录结构:

services.Configure<RazorViewEngineOptions>(options =>
{
    options.ViewLocationFormats.Clear();
    options.ViewLocationFormats.Add($"/Folder1/{{0}}{RazorViewEngine.ViewExtension}");
    options.ViewLocationFormats.Add($"/Folder2/{{0}}{RazorViewEngine.ViewExtension}");
    options.ViewLocationFormats.Add($"/Views/Shared/{{0}}{RazorViewEngine.ViewExtension}");
});

Folder1Controller代码如下:

public IActionResult Index()
{            
    return View();
}

它工作正常。但是,Folder2Controller代码看起来完全一样。问题在于,当它为Index()执行Folder2方法时,它首先会在Folder1中查找。我可以这样做:

public IActionResult Index(string id)
{
    return View("/Folder2/Index.cshtml");
}

我的问题是,有没有办法让Asp.Net Core首先在当前目录中查找?即使我使用相对路径("./Index"),它仍然会先到达Folder1

解决方法

您可以将名称为控制器名称的文件夹添加到folder1,folder2,以便路由可以识别要查找的视图。

首先,如下更改文件夹结构:

MyApp
--Folder1
  Folder1Controller.cs
  --Folder1
    Index.cshtml
--Folder2
  Folder2Controller.cs
  --Folder2
    Index.cshtml
--Views
  Shared
  etc..

启动:

  services.Configure<RazorViewEngineOptions>(options =>
                {
                    options.ViewLocationFormats.Clear();
                    options.ViewLocationFormats.Add("/Folder1/{1}/{0}" + RazorViewEngine.ViewExtension);
                    options.ViewLocationFormats.Add("/Folder2/{1}/{0}" + RazorViewEngine.ViewExtension);
                    options.ViewLocationFormats.Add($"/Views/Shared/enter image description here{RazorViewEngine.ViewExtension}");
                });

结果: {{0}}