使用片段链接到子操作

时间:2014-11-13 04:28:21

标签: asp.net-mvc-5 mvcsitemapprovider

我正在MVC 5中实现一个新站点,我们将旧内容组合成一个带有片段链接(#ChildAction)的长而流畅的页面。我选择使用Controller.Index作为主页面,然后使用内容,然后调用子操作(使用[ChildActionOnly]属性。

我的菜单是由我自己的自定义代码生成的(我找不到让MvcSitemapProvider做我想做的事情的方法,也找不到其他的东西),但我想以某种方式能够生成我的操作使用Url.Action作为片段进行网址管理,例如Controller#Action,而不是Controller/Action。最好的方法是什么?提出菜单解决方案的奖励点。

我是否应该坚持使用自己的自定义菜单编写自己的Url.MyAction扩展方法?

2 个答案:

答案 0 :(得分:2)

由于片段只是客户端,因此唯一可以实现此功能的方法是通过JavaScript进行子动作调用。浏览器在请求URL时不会向服务器发送片段信息,因此应用程序无法理解您要请求的操作。

也就是说,如果您使用了MvcSiteMapProvider,则可以使用custom attribute配置片段数据并修改/Views/Shared/DisplayTemplates/SiteMapNodeModel.cshtml以在URL末尾输出片段。有关示例,请参阅this answer

答案 1 :(得分:0)

我选择使用自己的菜单系统,并推出自己的@Url.MyAction方法:

public static string MyAction(this UrlHelper urlHelper,
                              [AspMvcAction] string action,
                              [AspMvcController] string controller) {
    // My MenuItem will use "Index" for Action and the anchor will be the
    // subMenu item, so GetMenuItem searches both anchors and action name
    MenuItem menuItem = MenuBuilder.GetMenuItem(action, controller);
    if (menuItem == null) return null;
    return urlHelper.Action(menuItem.ActionName, menuItem.ControllerName) + "#" + menuItem.Anchor;
}

请注意[AspMvcAction][AspMvcController]是JetBrains注释,以便在使用ReSharper时允许自动填充