C# ASP.NET Core 3.1 MVC应用程序-子目录中的搜索视图

C# ASP.NET Core 3.1 MVC应用程序-子目录中的搜索视图,c#,asp.net-mvc,razor,C#,Asp.net Mvc,Razor,我知道有一个区域特征。但我认为这正是我真正需要的 我有一个基于MVC模板的netcoreapp3.1构建 我有一个HomeController(名称空间My.Project.Controllers) 我还有一个设置控制器(名称空间My.Project.Controllers.Admin) 在我的\u Layout.cshtml中,我像这样链接到控制器(生成的链接是https://localhost:5001/admin/settings/如预期 @if(User.IsInRole(“admi

我知道有一个区域特征。但我认为这正是我真正需要的

  • 我有一个基于MVC模板的
    netcoreapp3.1
    构建
  • 我有一个
    HomeController
    (名称空间
    My.Project.Controllers
  • 我还有一个
    设置控制器
    (名称空间
    My.Project.Controllers.Admin
  • 在我的
    \u Layout.cshtml
    中,我像这样链接到控制器(生成的链接是
    https://localhost:5001/admin/settings/
    如预期
@if(User.IsInRole(“admin”))
{
  • 设置
  • }
    我还将第一个
    MapControllerRoute
    添加到我的
    启动.Configure
    方法中

    app.UseEndpoints(端点=>
    {
    endpoints.MapControllerRoute(
    名称:“管理员”,
    模式:“admin/{controller=Home}/{action=Index}/{id?}”
    );
    endpoints.MapRazorPages();
    endpoints.MapControllerRoute(
    名称:“默认”,
    模式:“{controller=Home}/{action=Index}/{id?}”);
    endpoints.MapRazorPages();
    });
    
    控制器被调用,并且

    公共类设置控制器:控制器
    {
    私有只读设置提供程序设置提供程序;
    公共设置控制器(ISettingsProvider设置sProvider)
    {
    this.settingsProvider=设置sProvider;
    }
    公共IActionResult索引()
    {
    var settings=settingsProvider.GetSettings();
    返回视图(设置);
    }
    }
    
    现在我得到以下错误

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

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

    我与nancy fx合作过很多次,我习惯了这样一种惯例,即首先在
    views/Admin/Settings
    中搜索
    My.Project.Modules.Admin.SettingsModule
    的视图

    如何使用ASP.NET核心MVC实现同样的功能(对于
    My.Project.Controllers.Admin.SettingsController
    views/Admin/Settings
    中搜索视图)

    你试过这个吗

    @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>
    
    @使用(Html.BeginForm(“Index”、“Settings”、“Admin”FormMethod.Get))
    {
    @if(User.IsInRole(“admin”))
    {
    
  • 设置
  • } }你试过这个吗

    @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>
    
    @使用(Html.BeginForm(“Index”、“Settings”、“Admin”FormMethod.Get))
    {
    @if(User.IsInRole(“admin”))
    {
    
  • 设置
  • }
    }

    我认为您的问题在于路由的创建

    有更多关于这方面的信息

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

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

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

    有更多关于这方面的信息

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

     pattern: "{area:exists}/{controller=Home}/{action=Index}/{id?}"
    
    解决了的 我必须做四件事

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

    public void配置(IApplicationBuilder应用程序,IWebHostEnvironment环境)
    {
    app.UseEndpoints(端点=>
    {
    endpoints.MapControllerRoute(
    名称:“区域”,
    模式:“{area:exists}/{controller=Home}/{action=Index}”);
    endpoints.MapControllerRoute(
    名称:“默认”,
    模式:“{controller=Home}/{action=Index}/{id?}”);
    endpoints.MapRazorPages();
    });
    
    其次,我需要告诉我的控制器它属于管理区

    [区域(“管理”)]
    公共类设置控制器:控制器
    {
    }
    
    在我的布局中,我必须将
    asp区域
    属性设置为
    admin

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

    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");
        });
    
    services.Configure(选项=>
    {
    //{0}-操作名称
    //{1}-控制器名称
    //{2}-区域名称
    添加(“/Views/{2}/{1}/{0}.cshtml”);
    });
    
    已解决 我必须做四件事

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

    public void配置(IApplicationBuilder应用程序,IWebHostEnvironment环境)
    {
    app.UseEndpoints(端点=>
    {
    endpoints.MapControllerRoute(
    名称:“区域”,
    模式:“{area:exists}/{controller=Home}/{action=Index}”);
    endpoints.MapControllerRoute(
    名称:“默认”,
    模式:“{controller=Home}/{action=Index}/{id?}”);
    endpoints.MapRazorPages();
    });
    
    其次,我需要告诉我的控制器它属于管理区

    [区域(“管理”)]
    公共类设置控制器:控制器
    {
    }
    
    在我的布局中,我必须将
    asp区域
    属性设置为
    admin

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

    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");
        });
    
    services.Configure(选项=>
    {
    //{0}-操作名称
    //{1}-控制器名称
    //{2}-区域名称
    添加(“/Views/{2}/{1}/{0}.cshtml”);
    });