无法使ActionLink或RouteLink生成正确的URL

Ale*_*gas 2 .net c# asp.net-mvc asp.net-routing asp.net-mvc-3

我是ASP.NET MVC的新手(使用版本3)并且无法获得ActionLinkRouteLink正如我期望的那样工作.在这个应用程序中,一个事件可以有很多活动,我希望使用以下方式路由到它们:

/Event/1/Activity
/Event/1/Activity/Index  (same as previous)
/Event/1/Activity/Details/5

这两个助手生成的HTML总是如下所示:

/Event/1

这是代码......

查看Razor HTML

@Html.RouteLink("View Sessions", "SubControllerIndex",
    new { eventId = Model.Id, controller = "Activity", action = "Index" })
@Html.ActionLink("View Sessions", "Index", "Activity", new { eventId = Model.Id }, null)
Run Code Online (Sandbox Code Playgroud)

路由映射

routes.MapRoute(
    "SubControllerIndex",
    "Event/{eventId}/{controller}",
    new { controller = "Activity", action = "Index" },
    new { eventId = @"\d+" }
);
routes.MapRoute(
    "ActivityIndex",
    "Event/{eventId}/{controller}/{action}/{id}",
    new { controller = "Activity", action = "Index", id = UrlParameter.Optional },
    new { eventId = @"\d+", id = @"\d*" }
);
routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // URL with parameters
    new { controller = "Home", action = "Index", id = UrlParameter.Optional }, // Parameter defaults
    new { id = @"\d*" }
);
Run Code Online (Sandbox Code Playgroud)

活动控制器

public ActionResult Index(long eventId)
{
    var activities = _context.Activities.Where(a => a.Event.Id == eventId).ToList();
    return View(activities);
}
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么想法?

mry*_*ren 5

该路由系统生成的原因/Event/1,而不是/Event/1/Activity/Index为路线

routes.MapRoute(
   "ActivityIndex",
   "Event/{eventId}/{controller}/{action}/{id}",
   new { controller = "Activity", action = "Index", id = UrlParameter.Optional },
   new { eventId = @"\d+", id = @"\d*" }
);
Run Code Online (Sandbox Code Playgroud)

是因为在生成网址时,系统不会在网址中包含任何默认值.在这种情况下,controller的默认值是Activity,action的默认值是Index.从而,

@Html.RouteLink("View Sessions", "SubControllerIndex",
    new { eventId = Model.Id, controller = "Activity", action = "Index" })
Run Code Online (Sandbox Code Playgroud)

将产生/Event/1而不是/Event/1/Activity/Index.如果单击该链接,您仍应转到ActivityController上的Index操作方法.