我正在MVC 5中实现一个新站点,我们将旧内容组合成一个带有片段链接(#ChildAction
)的长而流畅的页面。我选择使用Controller.Index
作为主页面,然后使用内容,然后调用子操作(使用[ChildActionOnly]
属性。
我的菜单是由我自己的自定义代码生成的(我找不到让MvcSitemapProvider做我想做的事情的方法,也找不到其他的东西),但我想以某种方式能够生成我的操作使用Url.Action
作为片段进行网址管理,例如Controller#Action
,而不是Controller/Action
。最好的方法是什么?提出菜单解决方案的奖励点。
我是否应该坚持使用自己的自定义菜单编写自己的Url.MyAction
扩展方法?
答案 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时允许自动填充