我的区域在下面。仅突出显示相关部分。
路线表
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
你能告诉我缺少什么吗?
答案 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