Условно добавьте htmlAttributes в ASP.NET MVC Html.ActionLink. - PullRequest
10 голосов
/ 13 мая 2010

Мне интересно, можно ли условно добавить параметр при вызове метода.

Например, я отображаю кучу ссылок (всего шесть) для навигации по моему сайту. Мастер:

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

Я бы хотел включить CSS-класс «selected» для ссылки, если она находится на этой странице. Итак, в моем контроллере я возвращаю это:

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

А затем в представлении у меня есть словарь htmlAttributes:

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

Теперь мой единственный вопрос - как мне включить атрибуты html для правильного ActionLink. Я мог бы сделать это так для каждой ссылки:

<% 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, который использует преимущества моих маршрутов вместо жесткого кодирования тега.

1 Ответ

15 голосов
/ 13 мая 2010

Вот три варианта:

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