【问题标题】:Conditionally add htmlAttributes to ASP.NET MVC Html.ActionLink有条件地将 htmlAttributes 添加到 ASP.NET MVC Html.ActionLink
【发布时间】:2011-02-18 22:38:15
【问题描述】:

我想知道是否可以在调用方法时有条件地添加参数。

例如,我在我的 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 这样的东西,它利用我的路线而不是硬编码标签。

【问题讨论】:

    标签: c# asp.net-mvc parameters conditional actionlink


    【解决方案1】:

    这里有三个选项:

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

    【讨论】:

    • 完美答案。感谢您的选择!
    • 我发现这不适用于 disabled 属性,因为浏览器会在 disabled="" 的情况下禁用 html 元素。编写自己的 html 辅助方法似乎是这种情况的唯一解决方案。
    • 从 MVC 4 开始,您可以将任何属性设置为 null,它根本不会呈现该属性。
    猜你喜欢
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-17
    • 2018-07-19
    • 2014-09-04
    • 2012-05-19
    • 2013-12-23
    相关资源
    最近更新 更多