2011-11-29 79 views
4

我有以下的導航HTML /代碼現在複製跨幾個意見:如何在ASP MVC3中創建可重用的導航菜單?

<ul class="topNav"> 
    <li class="selected">@Html.ActionLink("Dashboard", "Dashboard", new { id = ViewContext.RouteData.GetRequiredString("id") })</li> 
    <li>@Html.ActionLink("Stats", "Stats", new { id = ViewContext.RouteData.GetRequiredString("id") })</li> 
    <li>@Html.ActionLink("Questions", "Questions", new { id = ViewContext.RouteData.GetRequiredString("id") })</li> 
    <li>@Html.ActionLink("Answers", "Answers", new { id = ViewContext.RouteData.GetRequiredString("id") })</li> 
    <li>@Html.ActionLink("Contacts", "Contacts", new { id = ViewContext.RouteData.GetRequiredString("id") })</li> 
</ul> 

當然每個視圖中liclass="selected"改變。是否有一種簡單的方法將這段代碼放在部分視圖或佈局視圖中?

此外,我必須真的使用ViewContext.RouteData.GetRequiredString("id")去控制器的id參數還是有一個更簡單的方法?

回答

1

以下是處理該問題的兩種方法。

  1. 如果你想要一個真正可重複使用(應用independ解決方案)如果你需要它只是在你的應用考慮做這樣的事情,你應該創建一個方法的HtmlHelper Creating Custom HTML Helpers

  2. public static class ControllerHelper 
    { 
    /// <summary> 
    /// Checks the current action via RouteData 
    /// </summary> 
    /// <param name="helper">The HtmlHelper object to extend</param> 
    /// <param name="actionName">The Action</param> 
    /// <param name="controllerName">The Controller</param> 
    /// <returns>Boolean</returns> 
    public static bool IsCurrentAction(this HtmlHelper helper, string actionName, string controllerName) 
    { 
        string currentControllerName = (string)helper.ViewContext.RouteData.Values["controller"]; 
        string currentActionName = (string)helper.ViewContext.RouteData.Values["action"]; 
    
        if (currentControllerName.Equals(controllerName, StringComparison.CurrentCultureIgnoreCase) && currentActionName.Equals(actionName, StringComparison.CurrentCultureIgnoreCase)) 
         return true; 
    
        return false; 
    
    } 
    } 
    
    
    <ul class="topNav"> 
        <li @if(Html.IsCurrentAction("DashBoard", "DashBoard")) { <text>class="selected"</text> }>@Html.ActionLink("Dashboard", "Dashboard", new { id = ViewContext.RouteData.GetRequiredString("id") })</li> 
        <li>@if(Html.IsCurrentAction("Stats", "Stats")) { <text>class="selected"</text> }>@Html.ActionLink("Stats", "Stats", new { id = ViewContext.RouteData.GetRequiredString("id") })</li> 
    
    // .... 
    </ul> 
    

請告訴我,如果你想實現第一種方法,我會提供更多的幫助

希望這有助於

+0

我閱讀了您提供的鏈接或創建自定義HTML助手。這實際上不是你在#2做的事嗎?畢竟,#2是HtmlHelper的擴展方法。那麼#1有什麼不同?你的意思是#1可能是'@ Html.Menu()',它會產生完整的菜單? – parleer

+0

#1意味着它就像@ Html.Menu()正確。您的列表項可以傳遞給此方法。該方法生成html並將其返回給您的視圖。 – dknaack