2011-07-09 41 views
0

对于使用不是最好的imo的Html帮助器方法的设置,因为我使用静态字段。在菜单中设置当前,当前和当前元素之后

public enum CurrentState 
{ 
    BeforeCurrent, 
    AfterCurrent 
} 

public static CurrentState currentState = CurrentState.BeforeCurrent; 

public static MvcHtmlString ActiveActionLink(this HtmlHelper helper, string linkText, string actionName, string controllerName, bool checkAction = true) 
{ 
    string currentAction = helper.ViewContext.RouteData.GetRequiredString("action"); 
    string currentController = helper.ViewContext.RouteData.GetRequiredString("controller"); 

    if ((controllerName == currentController) && checkAction && (actionName == "Index")) 
    { 
     currentState = CurrentState.BeforeCurrent; 
    } 

    if ((controllerName == currentController) && checkAction && (actionName != currentAction)) 
    { 
     if (currentState == CurrentState.BeforeCurrent) 
     { 
      return helper.ActionLink(linkText, actionName, controllerName, null, new { @class = "beforeCurrent" }); 
     } 
     else if (currentState == CurrentState.AfterCurrent) 
     { 
      return helper.ActionLink(linkText, actionName, controllerName, null, new { @class = "afterCurrent" }); 
     } 
    } 

    if ((controllerName == currentController) && (!checkAction || (actionName == currentAction))) 
    { 
     currentState = CurrentState.AfterCurrent; 
     return helper.ActionLink(linkText, actionName, controllerName, null, new { @class = "current" }); 
    } 

    return helper.ActionLink(linkText, actionName, controllerName); 
} 

我有菜单的两个层次,这就是为什么我使用checkAction参数:

  • 主菜单 - @ Html.ActiveActionLink(Resources.Global.mainMenuBoard, “索引”, “董事会”,checkAction :假)
  • 侧菜单 - @ Html.ActiveActionLink(@ Resources.Global.managementOverview,“索引”,“管理”)

和侧面菜单我需要知道,如果它的后电流之前(重叠项目...)。

这是一种改进方法吗? 此外,我必须说,我也使用JavaScript,但它也必须适用于JavaScript禁用。

+0

它是无用的,我不知道静态是相同的每个网站的实例... – mrzepa

回答

0

我终于解决了在一个帮手生成整个菜单:

public class Link 
{ 
    public string LinkText { get; set; } 
    public string ActionName { get; set; } 
} 

public static List<MvcHtmlString> SubMenuLinks(this HtmlHelper helper, string controllerName, List<Link> links) 
{ 
    List<MvcHtmlString> menuElements = new List<MvcHtmlString>(); 
    string actualCssClass = "beforeCurrent"; 

    string currentAction = helper.ViewContext.RouteData.GetRequiredString("action"); 
    string currentController = helper.ViewContext.RouteData.GetRequiredString("controller"); 

    foreach (Link link in links) 
    { 
     if (controllerName == currentController && link.ActionName == currentAction) 
     { 
      menuElements.Add(helper.ActionLink(link.LinkText, link.ActionName, controllerName, null, new { @class = "current" })); 
      actualCssClass = "afterCurrent"; 
     } 
     else 
     { 
      menuElements.Add(helper.ActionLink(link.LinkText, link.ActionName, controllerName, null, new { @class = actualCssClass })); 
     } 
    } 

    return menuElements; 
} 

,并考虑:

@{ 
    List<MvcHtmlString> actionMenu = Html.SubMenuLinks("Manager", new List<Link>() 
    { 
     new Link() { LinkText = "linkText", ActionName = "actionName" }, 
     new Link() { LinkText = "linkText2", ActionName = "actionName2" } 
    }); 
} 
@section SideMenu 
{ 
    @for (int i = 0; i < actionMenu.Count; i++) 
    { 
     <li id="[email protected](i)">@actionMenu.ElementAt(i)</li> 
    } 
} 

并不完美,但它的作品至少。