2011-02-22 14 views
12

我有一個小的MVC網站,使用Html.ActionLink助手的導航欄。我想改變的一件事是,默認的ActionLink會呈現出一個頁面的HTML鏈接,即使它是當前頁面。自定義動作鏈接助手,知道你在哪個網頁

例如,它會創建這樣一個鏈接:

<a href="/myUrl">Some title...</a> 

即使你已經在/ myUrl。這將是很好,如果它會禁用該鏈接,也許插入一個特殊的CSS類來顯示當前訪問的頁面,就像這樣:

<a href="#" class="currentPageCSS">My Url</a> 
<a href="/someOtherUrl">Some Other Url</a> 

必須已經遇到過的MVC網站的負載這個問題,所以我m好奇地知道別人如何解決它。

回答

32

這似乎是一個很好的場景來推出自定義的HTML幫手。因此,讓我們把它卷:

public static class LinkExtensions 
{ 
    public static MvcHtmlString MyActionLink(
     this HtmlHelper htmlHelper, 
     string linkText, 
     string action, 
     string controller 
    ) 
    { 
     var currentAction = htmlHelper.ViewContext.RouteData.GetRequiredString("action"); 
     var currentController = htmlHelper.ViewContext.RouteData.GetRequiredString("controller"); 
     if (action == currentAction && controller == currentController) 
     { 
      var anchor = new TagBuilder("a"); 
      anchor.Attributes["href"] = "#"; 
      anchor.AddCssClass("currentPageCSS"); 
      anchor.SetInnerText(linkText); 
      return MvcHtmlString.Create(anchor.ToString()); 
     } 
     return htmlHelper.ActionLink(linkText, action, controller); 
    } 
} 

和您的視圖中:

<%= Html.MyActionLink("hello foo", "Index", "Home") %> 
<%= Html.MyActionLink("hello bar", "About", "Home") %> 
... 

,並根據你所在的助手將生成適當的錨上。

+3

不錯的主意!我將無恥地竊取並整合它。 – Iain 2011-02-22 22:53:16

+0

@Iain,請爲自己服務:-) – 2011-02-22 22:56:15

+0

這個班級應該放在哪裏,你如何包括它? – 2013-04-25 04:54:27