【问题标题】:ASP.NET MVC Controller SubFolderASP.NET MVC 控制器子文件夹
【发布时间】:2018-10-18 09:15:47
【问题描述】:

我正在使用 ASP.NET MVC 并尝试创建一个控制器子文件夹。我查看了该网站上的其他帖子并尝试了我在网上找到的内容,但它仍然遇到了这个问题:

HTTP 404. The resource you are looking for (or one of its dependencies) could have been removed, had its name changed, or is temporarily unavailable.  Please review the following URL and make sure that it is spelled correctly.

下面的截图是我在控制器文件夹中创建的子文件夹。

这是我的 View 文件夹的屏幕截图。

这是我在 RouteConfig.cs 文件中尝试的内容

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );

    routes.MapRoute(
        name: "AdminSubForder",
        url: "admin/{controller}/{action}/{id}",
        defaults: new { controller = "HomeAdmin", action = "Index", id = UrlParameter.Optional }
    );
}

但我的子文件夹仍然无法使用。我在这里做错了什么?

【问题讨论】:

  • 您必须在 Map.Route 中指定您的控制器命名空间名称,以便它可以找到控制器。参考这篇文章stackoverflow.com/questions/17178688/controller-in-sub-folder 另外,将您的管理路由移到第一个位置,因为路由应该定义最具体到最不具体。
  • @KD 在我的 RouteConfig.cs 文件中吗?
  • 我会第一个咬人:除非你有要求,否则不要这样做。停止。你只是在与 MVC 战斗。你没有让它为你的公司或雇主做任何新的事情或增加价值。

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


【解决方案1】:

尝试以下操作...

首先以下列方式定义您的路由... 路由应定义为从Most SpecificLeast Specific模式

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
                    name: "AdminSubForder",
                    url: "admin/{controller}/{action}/{id}",
                    defaults: new { controller = "HomeAdmin", action = "Index", id = UrlParameter.Optional }
                );
            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );


        }

如果它仍然不起作用,请尝试添加控制器的程序集名称,如下面的帖子所述。Controller sub folder

另外,请告诉我们您为访问该页面而输入的 URL。

【讨论】:

  • 我试过你的代码,新的错误:The view 'Index' or its master was not found or no view engine supports the searched locations. The following locations were searched:
  • 这真的很棒!!这意味着您的 Url 现在正在工作.. 我们的下一个问题是帮助 MVC 找到视图路径.. 它一定已经为您提供了它搜索的路径列表。现在我们需要确保它正在考虑我们的路径。如我所见,您的视图位于 Views/admin/homeadmin/。我们需要确保 MVC 应该搜索此路径以找到关联的视图
  • 您可以参考以下链接添加此路径吗?此链接中提供的两个答案都可以使用。如果您需要这方面的帮助,请告诉我。 stackoverflow.com/questions/799838/…
【解决方案2】:

根据 MVC 架构,视图是从 Views 文件夹内名为控制器名称的子文件夹呈现的。我不认为在 Views 中嵌套文件夹对你有用。相反,如果您想整理文件夹,您可以选择“区域”。

【讨论】:

  • “区域”是什么意思?是不是 VS 的新概念?
  • @KonradViltersten 是的,这是 MVC 中的概念。 Area 允许将大型应用程序划分为更小的单元,其中每个单元包含单独的 MVC 文件夹结构,并自动处理控制器的路由和区域内的视图呈现。
【解决方案3】:

通常,当您直接将控制器(或任何类文件)添加到文件夹(或子文件夹)中时,Visual Studio 会修改类文件中的命名空间以匹配该文件夹。因此,在您的情况下,您的类中不会有“myprojectname.controller”命名空间,而是会有“myprojectname.controller.admin”命名空间。

解决方案?好吧,我一直这样做,并在一堆文件夹中放置控制器来组织我的代码。最简单的方法是首先将控制器添加到“控制器”文件夹中。这样,它将具有适当的名称空间。然后,只需将文件拖放到要组织它的文件夹中。因此,无论何时创建控制器,请确保在“控制器”文件夹中创建它。我只需右键单击“控制器”文件夹并创建控制器。然后将文件拖到您想要的任何文件夹中。

【讨论】:

    【解决方案4】:

    假设您使用的是 MVC5,我肯定会考虑通过以下方式使用 ASP.NET MVC 的 attribute-based routing 功能:

    1) 在 /App_Start/RouteConfig.cs 文件中调用routes.MapMvcAttributeRoutes() 方法:

    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
            routes.MapMvcAttributeRoutes();
    
            // other routes.MapRoute() settings
        }
    }
    

    2) 按以下方式在“子文件夹”控制器中使用[Route] 属性:

    [Route("Admin/HomeAdmin/{action}")]
    // URL: /Admin/HomeAdmin/YourActionName
    public class HomeAdminController : GestioneController
    {
        // TODO: Put your Action Methods here
        // They will respond to 
    }
    

    如果您需要更多信息,请查看我在此主题上写的 this blog post

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多