In a recent project of mine I did it using HtmlHelper extensions and getting data from the ViewContext.RouteData.Values collection.
So building off a simple extension like this:
public static string OnClass(this HtmlHelper html, bool isOn)
{
if (isOn)
return " class="on"";
return string.Empty;
}
You can build up any number of combinations, e.g.
Just testing the current action:
public static string OnClass(this HtmlHelper html, string action)
{
string currentAction = html.ViewContext.RouteData.Values["action"].ToString();
return html.OnClass(currentAction.ToLower() == action.ToLower());
}
Testing for a number of actions:
public static string OnClass(this HtmlHelper html, string[] actions)
{
string currentAction = html.ViewContext.RouteData.Values["action"].ToString();
foreach (string action in actions)
{
if (currentAction.ToLower() == action.ToLower())
return html.OnClass(true);
}
return string.Empty;
}
Testing for action and controller:
public static string OnClass(this HtmlHelper html, string action, string controller)
{
string currentController = html.ViewContext.RouteData.Values["controller"].ToString();
if (currentController.ToLower() == controller.ToLower())
return html.OnClass(action);
return string.Empty;
}
Etc, etc.
Then you simply call it in your view(s) like so
<ul id="left-menu">
<!-- simple boolean -->
<li <%= Html.OnClass(something == somethingElse) %>>Blah</li>
<!-- action -->
<li <%= Html.OnClass("Index") %>>Blah</li>
<!-- any number of actions -->
<li <%= Html.OnClass(new string[] { "Index", "Details", "View" }) %>>Blah</li>
<!-- action and controller -->
<li <%= Html.OnClass("Index", "Home") %>>Blah</li>
</ul>
Which ever way you look at it, HtmlHelper extensions are your friend! :-)
HTHs
Charles
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…