如何在ASP MVC3中创建可重用的导航菜单?

时间:2011-11-29 17:09:21

标签: asp.net-mvc-3

我在以下几个视图中复制了以下导航html /代码:

<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>

当然,在每个视图中class="selected"的{​​{1}}都已更改。有没有一种简单的方法可以将这段代码放在局部视图或布局视图中?

另外,我真的必须使用li来获取控制器的ViewContext.RouteData.GetRequiredString("id")参数,还是有更简单的方法?

2 个答案:

答案 0 :(得分:1)

以下是两种处理方式。

  1. 如果你想要一个真正可重用(Application 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>
    
  3. 请告诉我,如果您想实施第一种方法,我会提供更多帮助

    希望这会有所帮助

答案 1 :(得分:0)

您可以在App_code文件夹中创建静态帮助器方法。 请查看Reusing @helpers across multiple views

的部分

您可以接受一个参数来定义哪个LI应该具有所选的类。