【问题标题】:ASP.NET MVC - style list item based on controllerASP.NET MVC - 基于控制器的样式列表项
【发布时间】:2010-11-16 20:56:43
【问题描述】:

我的最终目标是创建一个菜单,将一个类添加到与我所在的当前页面相关联的列表项中。

所以我进行了设置,使每个控制器都与我的菜单中的一个项目相关联。我需要向该列表项添加一个类(更改颜色、背景等)。

有没有简单的方法来做到这一点?给View传一个值,然后呢?

【问题讨论】:

  • @Robert - 有点,但我想要一个非 JavaScript 解决方案。我认为理想情况下,因为我在服务器上拥有我需要的所有信息,所以我可以在服务器上执行此操作。

标签: css asp.net-mvc


【解决方案1】:

在我最近的一个项目中,我使用 HtmlHelper 扩展并从 ViewContext.RouteData.Values 集合中获取数据。

所以构建一个像这样的简单扩展:

public static string OnClass(this HtmlHelper html, bool isOn)
{
    if (isOn)
        return " class=\"on\"";

    return string.Empty;
}

您可以建立任意数量的组合,例如

只是测试当前的动作:

public static string OnClass(this HtmlHelper html, string action)
{
    string currentAction = html.ViewContext.RouteData.Values["action"].ToString();

    return html.OnClass(currentAction.ToLower() == action.ToLower());
}

测试一些动作:

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

测试动作和控制器:

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

等等等等

然后您只需像这样在视图中调用它

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

无论您怎么看,HtmlHelper 扩展都是您的朋友! :-)

HTH
查尔斯

【讨论】:

  • 我刚刚有机会查看并实施它。太棒了!谢谢老兄!
  • if (currentAction.ToLower() == action.ToLower()).. 我认为比较字符串的正确方法是使用 StringComparison.InvariantCultureIgnoreCase
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
相关资源
最近更新 更多