子文件夹中的控制器

时间:2013-06-18 20:51:54

标签: asp.net-mvc asp.net-mvc-3

我的区域在下面。仅突出显示相关部分。

enter image description here

路线表

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

    routes.MapRoute(
        "SubFolder", // Route name
        "SubFolder/ChildController",
        new { controller = "ChildController", action = "Index" },
        new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" });


    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}", // URL with parameters
        new { controller = "Home", action = "Index" } // Parameter defaults
    );
}

仅当网址如此

时才有效
localhost:2474/SOProblems/ChildController/index 

当网址如下时,这不起作用

localhost:2474/SOProblems/SubFolder/ChildController/index

你能告诉我缺少什么吗?

3 个答案:

答案 0 :(得分:15)

  

当url是这样时,这不起作用   本地主机:2474 / SOProblems /子文件夹/ ChildController /索引

这是正常的。路由模式如下所示:SubFolder/ChildController而不是SubFolder/ChildController/index。除此之外,您还在错误的位置定义了路线。您在主路径定义中定义了它,而不是在您的区域路径定义中定义它。因此,从主要路由中删除自定义路由定义并将其添加到SOProblemsAreaRegistration.cs文件(这是您的SOProblems路由应该注册的位置):

public override void RegisterArea(AreaRegistrationContext context)
{
    context.MapRoute(
        "SubFolderRoute", 
        "SOProblems/SubFolder/ChildController",
        new { controller = "ChildController", action = "Index" },
        new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" }
    );

    context.MapRoute(
        "SOProblems_default",
        "SOProblems/{controller}/{action}/{id}",
        new { action = "Index", id = UrlParameter.Optional }
    );
}

此外,由于您的路由模式(SOProblems/SubFolder/ChildController)无法指定操作名称,因此您只能在此控制器上执行一个操作,这将是您注册的默认操作({{1在这种情况下。

如果您想在此控制器上执行更多操作,但索引是默认操作,则应在路由模式中包含该操作:

index

在这两种情况下,您的主要路线定义都可以保留其默认值:

context.MapRoute(
    "SubFolder", 
    "SOProblems/SubFolder/ChildController/{action}",
    new { controller = "ChildController", action = "Index" },
    new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" }
);

答案 1 :(得分:5)

您的新路线“SubFolder”不包括在路线中包含操作的可能性(在您的情况下,“索引”)。

您的示例网址

localhost:2474/SOProblems/SubFolder/ChildController/index

想要尝试匹配以下路线:

"SubFolder/ChildController/{action}"

但是您的路线中没有包含“{action}”,因此它与您的路线不符。然后它会尝试默认路由,这显然会失败。

尝试在您的路线中添加“{action}”:

routes.MapRoute(
    "SubFolder", // Route name
    "SubFolder/ChildController/{action}",
    new { controller = "ChildController", action = "Index" },
    new[] { "Practise.Areas.SOProblems.Controllers.SubFolder" });

或从测试网址中删除“index”。

答案 2 :(得分:2)

对于任何希望这样做的未来用户;研究使用区域。 这是一个有用的视频。 Organizing an application using Areas