2011-06-12 56 views

回答

5

您可以測試當前的行動,如果它匹配應用CSS類:

<% if (ViewContext.RouteData.GetRequiredString("action") == "About") { %> 
    ... highlight here 
<% } %> 

更妙的是我會寫一個HTML輔助生成菜單:

public static MvcHtmlString MenuItem(
    this HtmlHelper htmlHelper, 
    string text, 
    string action, 
    string controller 
) 
{ 
    var li = new TagBuilder("li"); 
    var routeData = htmlHelper.ViewContext.RouteData; 
    var currentAction = routeData.GetRequiredString("action"); 
    var currentController = routeData.GetRequiredString("controller"); 
    if (string.Equals(currentAction, action, StringComparison.OrdinalIgnoreCase) && 
     string.Equals(currentController, controller, StringComparison.OrdinalIgnoreCase)) 
    { 
     li.AddCssClass("active"); 
    } 
    li.InnerHtml = htmlHelper.ActionLink(text, action, controller).ToHtmlString(); 
    return MvcHtmlString.Create(li.ToString()); 
} 

,然後用它像這樣:

<ul> 
    <%= Html.MenuItem("Home", "Home", "Home") %> 
    <%= Html.MenuItem("About Me", "About", "Home") %> 
    <%= Html.MenuItem("My Work", "Work", "Home") %> 
    <%= Html.MenuItem("Blog", "Index", "Blog") %> 
    ... 
</ul> 

這會將active類添加到錨如果cur租金請求與鏈接的操作和控制器相匹配。

+0

感謝您的回答,看起來很有希望!我應該在哪裏放置該輔助方法的代碼?在SiteMaster的CodeBehind內部?我如何在我的'NavButton'類中生成所有div等? – KristianB 2011-06-12 14:29:05

+0

@KristianB,你應該把它放在一個靜態類中。這個靜態類可以放在例如'Extensions'文件夾中。只要確保將視圖中定義的靜態類的名稱空間引入到範圍中,以便助手變爲可見。請閱讀此處瞭解有關編寫自定義HTML幫助程序的更多信息:http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs – 2011-06-12 14:32:18

+0

您給了我一個主意......我只是嘗試使用會話變量我稱之爲'activeView'。在我的每個控制器中,我將這個變量設置爲特定的視圖。就像HomeController的Index()方法一樣,它會是'Session [「activeView」] =「Home」;'。然後,我在Sitemaster的代碼隱藏中添加了一些代碼,將該會話變量提取到可從SiteMaster本身訪問的屬性中。那麼這只是一個問題,是否可以通過我的方式。 – KristianB 2011-06-12 15:34:20

0

的方法我開發感謝這個帖子:

http://geekswithblogs.net/bdiaz/archive/2010/04/09/handy-asp.net-mvc-2-extension-methods-ndash-where-am-i.aspx

頗爲相似。然而,答案有一個大問題。假設我們有3個鏈接: 首頁,關於聯繫

我們有4個控制器與默認索引操作。 HomeController中AboutController的ContactControllerBiographyController

現在,在關於頁面的內容,我們有鏈接頁,這在控制器調用指數行動。

但是,點擊傳記鏈接,我想保留關於頁面,因爲它是「關於」部分的一部分。

我在網上找到的大多數解決方案都不包括這個重要的部分。

我開發的解決方案不需要在視圖中使用會話或一些惡臭代碼。所有我們需要的是:

<%= Html.ActionMenuItem("Home", "Index", "Home") %> 
<%= Html.ActionMenuItem("About", "Index", "About") %> 
<%= Html.ActionMenuItem("Contact", "Index", "Contact") %> 

由於解決這個問題很長我已經張貼在我的博客:

http://arturito.net/2011/08/03/asp-net-mvc-2-highlight-selected-menu-item-on-the-site-master-without-session/