作为讨论的基础。创建一个标准的ASP.NET MVC Web项目。
它将在母版页中包含两个菜单项:
<div id="menucontainer">
<ul id="menu">
<li>
<%= Html.ActionLink("Home", "Index", "Home")%></li>
<li>
<%= Html.ActionLink("About", "About", "Home")%></li>
</ul>
</div>
如何设置指示当前页面的可视CSS样式。 例如,在About页面/控制器中,我基本上想要这样做:
<%= Html.ActionLink("About", "About", "Home", new {class="current"})%></li>
当然,当在主页上时:
<%= Html.ActionLink("Home", "Index", "Home", new {class="current"})%></li>
(CSS样式名称当前在菜单中直观地指示这是当前页面。)
我可以将菜单div从主页面分成内容占位符,但这意味着我必须将菜单放在每个页面上。
任何想法,对此都有一个很好的解决方案吗?
答案 0 :(得分:24)
最简单的方法是从ViewContext的RouteData获取当前控制器和操作。请注意签名的更改和使用@来转义关键字。
<% var controller = ViewContext.RouteData.Values["controller"] as string ?? "Home";
var action = ViewContext.RouteData.Values["action"] as string ?? "Index";
var page = (controller + ":" + action).ToLower();
%>
<%= Html.ActionLink( "About", "About", "Home", null,
new { @class = page == "home:about" ? "current" : "" ) %>
<%= Html.ActionLink( "Home", "Index", "Home", null,
new { @class = page == "home:index" ? "current" : "" ) %>
请注意,您可以将这个HtmlHelper扩展程序与@ Jon's结合使用,并使其更清晰。
<%= Html.MenuLink( "About", "About", "Home", null, null, "current" ) %>
MenuActionLink的位置
public static class MenuHelperExtensions
{
public static string MenuLink( this HtmlHelper helper,
string text,
string action,
string controller,
object routeValues,
object htmlAttributes,
string currentClass )
{
RouteValueDictionary attributes = new RouteValueDictionary( htmlAttributes );
string currentController = helper.ViewContext.RouteData.Values["controller"] as string ?? "home";
string currentAction = helper.ViewContext.RouteData.Values["action"] as string ?? "index";
string page = string.Format( "{0}:{1}", currentController, currentAction ).ToLower();
string thisPage = string.Format( "{0}:{1}", controller, action ).ToLower();
attributes["class"] = (page == thisPage) ? currentClass : "";
return helper.ActionLink( text, action, controller, new RouteValueDictionary( routeValues ), attributes );
}
}
答案 1 :(得分:1)
我最近为此创建了一个HTML Helper,如下所示:
public static string NavigationLink(this HtmlHelper helper, string path, string text)
{
string cssClass = String.Empty;
if (HttpContext.Current.Request.Path.IndexOf(path) != -1)
{
cssClass = "class = 'selected'";
}
return String.Format(@"<li><a href='{0}' {1}>{2}</a></li>", path, cssClass, text);
}
实施如下:
<ul id="Navigation">
<%=Html.NavigationLink("/Path1", "Text1")%>
<%=Html.NavigationLink("/Path2", "Text2")%>
<%=Html.NavigationLink("/Path3", "Text3")%>
<%=Html.NavigationLink("/Path4", "Text4")%>
</ul>
答案 2 :(得分:1)
如果您使用的是T4MVC,可以使用:
public static HtmlString MenuLink(
this HtmlHelper helper,
string text,
IT4MVCActionResult action,
object htmlAttributes = null)
{
var currentController = helper.ViewContext.RouteData.Values["controller"] as string ?? "home";
var currentAction = helper.ViewContext.RouteData.Values["action"] as string ?? "index";
var attributes = new RouteValueDictionary(htmlAttributes);
var cssClass = (attributes.ContainsKey("class"))
? attributes["class"] + " "
: string.Empty;
string selectedClass;
if(action.Controller.Equals(currentController, StringComparison.InvariantCultureIgnoreCase)
{
selectedClass = "selected-parent";
if(action.Action.Equals(currentAction, StringComparison.InvariantCultureIgnoreCase))
selectedClass = "selected";
}
cssClass += selectedClass;
attributes["class"] = cssClass;
return helper.ActionLink(text, (ActionResult)action, attributes);
}
答案 3 :(得分:0)
可能只是它是第5个参数,所以在你的html属性之前插入一个null。这篇文章就是这样描述的,虽然你可以在第4篇论文中传递一些东西,但第5篇专门用于HTML属性
答案 4 :(得分:0)
<script type="javascript/text">
$( document ).ready( function() {
@if (Request.Url.AbsolutePath.ToLower() == "/")
{
@Html.Raw("$('.navbar-nav li').eq(0).attr('class','active');")
}
@if (Request.Url.AbsolutePath.ToLower().Contains("details"))
{
@Html.Raw("$('.navbar-nav li').eq(1).attr('class','active');")
}
@if (Request.Url.AbsolutePath.ToLower().Contains("schedule"))
{
@Html.Raw("$('.navbar-nav li').eq(2).attr('class','active');")
}
});
</script>
在5分钟内把它放在一起,我可能会重构它,但应该给你一个基本的想法,它可能对小型网站最有用。