2010-05-13 64 views
10

我不知道是否有可能在一个方法的调用有条件地添加参数。有条件加htmlAttributes到ASP.NET MVC Html.ActionLink

例如,我在我的Site.Master渲染一大堆的链接(总共六个)导航:

<%= Html.ActionLink("About", "About", "Pages") %> | 
<%= Html.ActionLink("Contact", "Contact", "Pages") %> 
<%-- etc, etc. --%> 

我想包括CSS类“选择了”如果链接它在那个页面上。所以在我的控制,我回到这一点:

ViewData.Add("CurrentPage", "About"); 
return View(); 

然后在视图中我有一个htmlAttributes词典:

<% Dictionary<string,object> htmlAttributes = new Dictionary<string,object>(); 
    htmlAttributes.Add("class","selected");%> 

现在我唯一的问题是我怎么包括适当的ActionLink的htmlAttributes 。我可以这样做每个链接:

<% htmlAttributes.Clear(); 
    if (ViewData["CurrentPage"] == "Contact") htmlAttributes.Add("class","selected");%> 
<%= Html.ActionLink("Contact", "Contact", "Pages", htmlAttributes) %> 

但这似乎有点重复。有一些办法做这样的事情的伪代码:

<%= Html.ActionLink("Contact", "Contact", "Pages", if(ViewData["CurrentPage"] == "Contact") { htmlAttributes }) %> 

这显然不是有效的语法,但有没有做一个正确的方法是什么?我愿意为渲染这些链接提供完全不同的建议。我想继续使用像ActionLink这样的功能,尽管可以利用我的路线,而不是硬编码标签。

回答

15

这里有三个选项:

<%= Html.ActionLink("Contact", "Contact", "Pages", 
     new { @class = ViewData["CurrentPage"] == "Contact" ? "selected" : "" }) %> 

<%= Html.ActionLink("Contact", "Contact", "Pages", 
     ViewData["CurrentPage"] == "Contact" ? new { @class = "selected" } : null) %> 

<a href="<%=Url.Action("Contact", "Pages")%>" 
    class="<%=ViewData["CurrentPage"] == "Contact" ? "selected" : "" %>">Contact</a> 
+0

完美的答案。感谢您的选择! – macca1 2010-05-13 04:32:14

+6

我发现这对禁用属性不起作用,因为浏览器在'disabled =“”'的情况下禁用了html元素。编写你自己的html助手方法似乎是这种情况的唯一解决方案。 – arviman 2011-06-28 00:03:04

+1

从MVC 4开始,您可以将任何属性设置为null,并且根本不会呈现该属性。 – 2014-04-29 02:39:30