【问题标题】:ASP.NET Core 3.1 MVC app - search views in subdirectoryASP.NET Core 3.1 MVC 应用程序 - 在子目录中搜索视图
【发布时间】:2021-03-10 07:35:52
【问题描述】:

我知道有一个区域特征。但我认为这对于我真正需要的东西来说已经足够了。

  • 我有一个从 MVC 模板构建的 netcoreapp3.1
  • 我有一个HomeController(命名空间My.Project.Controllers
  • 我还有一个SettingsController(命名空间My.Project.Controllers.Admin
  • 在我的_Layout.cshtml 中,我像这样链接到控制器(生成的链接是https://localhost:5001/admin/settings/,正如预期的那样。
@if (User.IsInRole("admin"))
{
    <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle text-dark" href="#" id="navbarDropdown" role="button"
            data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            Admin
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
            <a class="dropdown-item" asp-area="" asp-controller="settings" asp-action="Index">Settings</a>
        </div>
    </li>
}

我还将第一个 MapControllerRoute 添加到我的 Startup.Configure 方法中

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

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

控制器被调用并且

public class SettingsController : Controller
{
    private readonly ISettingsProvider settingsProvider;

    public SettingsController(ISettingsProvider settingsProvider)
    {
        this.settingsProvider = settingsProvider;
    }

    public IActionResult Index()
    {
        var settings = settingsProvider.GetSettings();
        return View(settings);
    }
}

现在我收到以下错误

处理请求时发生未处理的异常。 InvalidOperationException:未找到视图“索引”。搜索了以下位置:
/Views/Settings/Index.cshtml
/Views/Shared/Index.cshtml
/Pages/Shared/Index.cshtml

正如我已经说过的,我也尝试过使用区域,但这需要我将我的文件放在一个 Areas 文件夹中,并拥有自己的 Views 文件夹和 viewstart 等。

我与 nancy fx 合作了很多,我习惯于首先在 Views/Admin/Settings 中搜索 My.Project.Modules.Admin.SettingsModule 的视图。

如何使用 ASP.NET Core MVC 实现相同的效果(对于 Views/Admin/Settings 中的 My.Project.Controllers.Admin.SettingsController 搜索视图?)

- src/
  - Views/
    - Home/
      - Index.cshtml
    - Admin/
       - Settings/
         - Index.cshtml
  - Controllers/
    - Admin/
        SettingsController.cs
    - HomeController.cs

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    你试过了吗?

    @using (Html.BeginForm("Index", "Settings", "Admin" FormMethod.Get))
    {
       @if (User.IsInRole("admin"))
       {
    <li class="nav-item dropdown">
        <a class="nav-link dropdown-toggle text-dark" href="#" id="navbarDropdown" role="button"
            data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
            Admin
        </a>
        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
            <a class="dropdown-item" asp-area="" asp-controller="settings" asp-action="Index">Settings</a>
        </div>
    </li>
    

    } }

    【讨论】:

      【解决方案2】:

      我相信您的问题在于路由的创建。

      有更多关于这个here的信息

      我认为对于您当前的配置,如果您更改模式,它将解决您的问题

       pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
      

      【讨论】:

        【解决方案3】:

        已解决

        我必须做四件事。

        首先,我必须在Startup.Configure 中设置一个新的控制器路由

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
        
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                        name: "areas",
                        pattern: "{area:exists}/{controller=Home}/{action=Index}");
        
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Home}/{action=Index}/{id?}");
        
                endpoints.MapRazorPages();
            });
        

        其次,我需要告诉我的控制器它属于管理区域。

        [Area("admin")]
        public class SettingsController : Controller
        {
        }
        

        在我的布局中,我必须将 asp-area 属性设置为 admin

        <a class="dropdown-item" asp-area="admin" asp-controller="settings" asp-action="Index">Settings</a>
        

        但这还不够,因为默认只会搜索以下位置:

        InvalidOperationException: The view 'Index' was not found. The following locations were searched:
        
        /Areas/admin/Views/Settings/Index.cshtml
        /Areas/admin/Views/Shared/Index.cshtml
        /Views/Shared/Index.cshtml
        /Pages/Shared/Index.cshtml
        

        所以我不得不将它添加到 ConfigureServices 方法中。

        services.Configure<RazorViewEngineOptions>(options =>
            {
                // {0} - Action Name
                // {1} - Controller Name
                // {2} - Area Name
                options.AreaViewLocationFormats.Add("/Views/{2}/{1}/{0}.cshtml");
            });
        

        【讨论】:

          猜你喜欢
          • 2020-07-07
          • 1970-01-01
          • 2021-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多