2010-03-20 38 views
0

在我的母版頁我有一個使用ActionLinks創建頂級菜單:如何將動態htmlAttributes添加到htmlhelper ActionLinks?

<ul id="topNav"> 
    <li><%=Html.ActionLink("Home", "Index", "Home")%></li> 
    <li><%=Html.ActionLink("News", "Index", "News")%></li> 
    <li><%=Html.ActionLink("Projects", "Index", "Projects")%></li> 
    <li><%=Html.ActionLink("About", "About", "Home")%></li> 
    <li><%=Html.ActionLink("Contact", "Contact", "Home")%></li> 
    <li><%=Html.ActionLink("Photos", "Photos", "Photos")%></li> 
</ul> 

我要動態地添加一個名爲「當前」,以該網站目前指向鏈接類。因此,例如,當站點坐在主頁,菜單鏈接會呈現這樣的:

<li><a class="current" href="/">Home</a></li> 

我必須重載ActionLink的方法來做到這一點,或創建一個全新的HtmlHelper或有沒有更好的辦法?

我對MVC相當陌生,所以我不確定什麼是正確的方式去做這件事。

在此先感謝。

回答

2

你可以寫本自己的擴展方法(對不起,我VB是有點生疏):

<Extension> _ 
Public Shared Function MyActionLink(_ 
    ByVal htmlHelper As HtmlHelper, _ 
    ByVal linkText As String, _ 
    ByVal actionName As String, _ 
    ByVal controllerName As String) As MvcHtmlString 

    Dim currentAction As String = TryCast(htmlHelper.ViewContext.RouteData.Values.Item("action"), String) 
    Dim currentController As String = TryCast(htmlHelper.ViewContext.RouteData.Values.Item("controller"), String) 
    If ((actionName = currentAction) AndAlso _ 
     (controllerName = currentController)) _ 
    Then 
     Return htmlHelper.ActionLink(_ 
      linkText, _ 
      actionName, _ 
      controllerName, _ 
      Nothing, _ 
      New { _ 
       .class = "current" _ 
      }) 
    End If 
    Return htmlHelper.ActionLink(linkText, actionName, controllerName) 
End Function 

,你可以使用像這樣:

<ul id="topNav"> 
    <li><%=Html.MyActionLink("Home", "Index", "Home")%></li> 
    <li><%=Html.MyActionLink("News", "Index", "News")%></li> 
    <li><%=Html.MyActionLink("Projects", "Index", "Projects")%></li> 
    <li><%=Html.MyActionLink("About", "About", "Home")%></li> 
    <li><%=Html.MyActionLink("Contact", "Contact", "Home")%></li> 
    <li><%=Html.MyActionLink("Photos", "Photos", "Photos")%></li> 
</ul> 
+0

這工作完美!我只需要對代碼示例進行一次修改:htmlAttributes對象的語法爲 新增{.class =「current」} 謝謝! – camainc 2010-03-20 17:26:42

+0

我很高興你能完成這項工作。正如我所說我的VB.NET是生鏽的:-) – 2010-03-20 17:35:14

+0

不壞生鏽! – camainc 2010-03-20 19:24:50

0

從聲音你可能想要這樣的東西。

爲每個控制器創建一個默認構造函數並在ViewData中設置一個值。

public HomeController() 
    : base() 
{ 
    ViewData["selected"] = "home"; 
} 

然後在您的Site.Master文件,你可以這樣做:

<li class="<%= ((ViewData["selected"] == "home") ? "current" : "") %>"><%= Html.ActionLink("Home", "Index", "Home") %></li> 

它可以被清理了一下,但你的想法。

相關問題