2

ActionLink我是 ASP.NET MVC(使用版本 3)的新手,无法RouteLink按预期工作。在这个应用程序中,一个事件可以有许多活动,我希望使用以下方法路由到它们:

/事件/1/活动
/Event/1/Activity/Index(同上)
/事件/1/活动/详情/5

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

/事件/1

这是代码...

查看剃刀 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)

路由映射

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

活动控制器

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

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

4

4 回答 4

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

是因为在生成 url 时,系统不会在 url 中包含任何默认值。在这种情况下,controller 的默认值为 Activity,action 的默认值为 Index。因此,

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

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

于 2011-06-05T08:46:54.340 回答
1

正如 mrydengren 所指出的,ActionLink 和 RouteLink 方法将去掉与默认值相同的参数。然后 URL 应指向您所指向的操作。

如果您仍想使用完整的 URL,您可以创建一个没有默认值的路由,并使用 RouteLink 来创建与该路由的链接。

// Either add this at the end as a new route, or replace the one you already have.
routes.MapRoute("ActivityIndexWithoutParams",
    "Event/{eventId/controller/action/id},
    new{},
    new{ eventId = @"\d+", id = @"\d*"}
    );

现在您可以使用 RouteLink 方法来创建正确的路线:

@Html.RouteLink("View Sessions", "ActivityIndexWithoutParameters",
    new {eventid = Model.Id, controller = "activity", action = "index"}
    );
于 2011-06-05T09:03:03.007 回答
1

当我将项目切换到使用区域时,我在尝试(并尝试并尝试)找到为什么我的自定义 RouteBase 实现无法在出站路由(生成 URL 的路由)上运行的答案时遇到了这个问题。

在分析 MVC 源代码时,我终于偶然发现了答案:您必须实现自定义 RouteBase 实现IRouteWithArea,以便框架知道您的自定义路由属于哪个区域。

public class CustomRoute: RouteBase, IRouteWithArea
{
    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
         // Implement custom virtual path (url) here
    }

    #region IRouteWithArea Members

    public string Area
    {
        get { return "Store"; }
    }

    #endregion
}
于 2013-11-14T10:00:20.433 回答
0

请记住,路由是“贪婪的”,第一个匹配项将被处理,因此您需要丢失第一个路由条目,否则将永远无法到达第二个。

这是我可以看到您需要进行的唯一更改,否则很好,将操作链接添加到视图中,如下所示;

@Html.ActionLink("View Sessions", "Details", "Activity", new { eventId = 12, id = 22 }, null)

您应该会看到在链接中生成了正确的 URL。

于 2011-06-05T11:35:59.440 回答