ASP.NET MVC 控制器子文件夹

12

我正在使用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.
以下是我在控制器文件夹中创建的子文件夹的屏幕截图。 enter image description here 这是我的视图文件夹的屏幕截图。 enter image description here 这是我在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 }
    );
}

但是我的子文件夹仍然无法正常工作。我做错了什么?


2
在Map.Route中,您必须指定控制器命名空间名称,以便它可以找到控制器。请参考此帖子https://dev59.com/2GQn5IYBdhLWcg3wAjEX 另外,将您的管理员路由移动到第一个位置,因为路由应该从最具体到最不具体进行定义。 - K D
在我的RouteConfig.cs文件中@KD是什么意思? - user979331
请点击此链接:https://dev59.com/Y5Hea4cB1Zd3GeqPmj9u - sebu
1
我会率先发言:除非你有必要这样做,否则不要这样做。停止吧。你只是在与MVC斗争,而没有为公司或雇主增添任何新的价值或功能。 - Andy V
4个回答

8

尝试以下方法...

首先按照以下方式定义您的路由... 路由应该从最具体最不具体的模式进行定义。

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 }
            );


        }

如果仍然无法正常工作,请尝试按照以下帖子中提到的方式添加控制器的程序集名称:控制器子文件夹 此外,请告诉我们您输入的用于访问该页面的 URL。

1
我尝试了你的代码,出现新错误:未找到视图'Index'或其母版,或没有视图引擎支持搜索的位置。已搜索以下位置: - user979331
1
这真是太好了!这意味着您的URL现在可以正常工作。接下来我们需要解决的问题是帮助MVC定位视图路径。它必须已经为您提供了搜索过的路径列表。现在我们需要确保它考虑到我们的路径。我看到您的视图位于Views/admin/homeadmin/。我们需要确保MVC应该搜索此路径以查找相关视图。 - K D
1
请问您能否参考以下链接来添加此路径?此链接中提供的两个答案都可以使用。如果需要帮助,请告诉我。https://dev59.com/FXRA5IYBdhLWcg3w2x6W - K D

7
根据MVC架构,视图是从Views文件夹内控制器名称子文件夹中呈现的。我认为在Views文件夹内嵌套文件夹将不起作用。如果您想要组织文件夹,可以选择“Areas”。

“Areas”是什么意思?它是VS中的一个新概念吗? - Konrad Viltersten
1
@KonradViltersten 是的,这是MVC中的概念。Area允许将大型应用程序分割成较小的单元,其中每个单元包含单独的MVC文件夹结构,并自动处理控制器的路由和视图的呈现。 - LKC

3
通常情况下,当您直接将控制器(或任何类文件)添加到文件夹(或子文件夹)中时,Visual Studio会修改类文件中的命名空间以匹配该文件夹。因此,在您的情况下,您的类将不再具有“myprojectname.controller”命名空间,而是具有“myprojectname.controller.admin”命名空间。
解决方案?嗯,我经常这样做,并在许多文件夹中放置控制器来组织我的代码。最简单的方法是首先将控制器添加到“Controller”文件夹中。这样它就会有正确的命名空间。然后,只需将文件拖放到您想要组织的文件夹中即可。因此,每当您创建控制器时,请确保您在“Controller”文件夹中创建它。我只需右键单击“Controller”文件夹并创建控制器。然后将文件拖放到任何您想要的文件夹中即可。

0
假设您正在使用 MVC5,我肯定会考虑以下方式使用 ASP.NET MVC 的 基于属性的路由 功能:
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 
}

如果您需要更多信息,请查看我在此主题上撰写的博客文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接