根据当前操作在ActionLink上设置@class

时间:2014-08-09 14:17:30

标签: asp.net razor

我有一个带有actionlinks的简单菜单。他们都连接到同一个控制器。我希望他们有一个基本的HTML类,除非他们是主动,然后我想设置另一个类。 链接只是在要显示的数据之间切换。

我尝试过以下方法:

@Html.ActionLink("Oversikt", "Overview", "Statistics", null, new {@class= @(ViewContext.RouteData.Values["action"] as String == "Overview"  ? "activeStatMenuItem" : "statMenuItem") })

First compilation error

我认为它可能错过了ViewContext前面的@,但这并没有帮助,所以我尝试将所有东西都变成字符串。这使Visual Studio抱怨字符串(并且它也会产生编译错误)。

Complaining about the Strings

如果我也在类上添加它,比如;

@Html.ActionLink("Oversikt", "Overview", "Statistics", null, new {@class= "@(ViewContext.RouteData.Values['action'] as String == 'Overview'  ? 'activeStatMenuItem' : statMenuItem')" })

它将statMenuItem - 类添加到所有项目中。

使用'mystring'表示中间的字符串使得它停止抱怨,但不能解决我的问题 - 它只是将活动的CSS类添加到所有项目。

Using ' in the string

我发现如果我只是制作一个长字符串,并且中间没有"',那么一切都停止抱怨,但似乎它也会评估每个表达式为true,所以所有项目都会获得活动的CSS类。

我对Visual Studio,ASP.NET和Razor都很缺乏经验(周四从这个项目开始),所以我可能(或可能)错过了一些简单的东西。提前感谢您的耐心等待。

非常感谢所有帮助!

1 个答案:

答案 0 :(得分:1)

最简单的方法是创建变量,执行表示逻辑,然后将此字符串值分配给链接的@class。

@{
   var myClass = ViewContext.RouteData.Values["action"] as String == "Overview"  ? "activeStatMenuItem" : "statMenuItem";
}

然后再

@Html.ActionLink("Oversikt", "Overview", "Statistics", null, new {@class= myClass })

应该做的伎俩...希望你明白这个想法,没有测试过,所以它可能会略有不同。

将太多步骤合并为一行并不是一个好主意。很难以这种方式找到问题,而且更难以阅读和弄清楚,究竟发生了什么。