2012-04-30 3 views
1

У меня есть несколько вкладок в верхней части веб-страницы: дома, особенности, контакты и т.д.DRY подход к Razor синтаксиса разметки вкладку просматриваемой веб-страницы

мне нужна категория Я в настоящее время на быть отмечены как.

Как я могу соответствующим образом скопировать мою страницу _Layout.cshtml с синтаксисом бритвы, чтобы мне не нужно вручную отмечать соответствующую вкладку каждой страницы как class = "current"?

<li class="current">@Html.ActionLink("Home", "Index", "Home") 
<li>@Html.ActionLink("Blog", "Blog", "Home") 
<li>@Html.ActionLink("Portfolio", "Portfolio", "Home") 

ответ

3

Пример того, как вы могли это сделать.

@helper BuildLink(string name, string action, string controller) 
{ 
    var url = Url.Action(action, controller); 
    bool isActive = Request.Url.AbsolutePath.Equals(url, StringComparison.InvariantCultureIgnoreCase); 
    <li class="@(isActive ? "current" : String.Empty)"><a href="@(url)">@name</a></li> 
} 

@BuildLink("Home", "Index", "Home") 
@BuildLink("Blog", "Blog", "Home") 
@BuildLink("Portfolio", "Portfolio", "Home") 
+0

Кажется, хороший план, но я получаю эту ошибку: CS0103: Имя 'URL' не существует в текущем контексте - в отношении var url = Url.Action (действие, контроллер); – Ecnalyr

+0

Это странно, я бы сказал, может быть, вы не ссылались на System.Web.MVC, но Html.ActionLink уже этого требует. Ваша главная страница наследует System.Web.Mvc.ViewMasterPage? (смотрите в свой файл конфигурации) – DMulligan

+0

Слово «Мастер» вообще не входит в мой проект, поэтому я не думаю. Я добавил эту строку в мой раздел пространств имен в config: - не помогло, я предполагаю, что я сделал это неправильно. Кроме того, до сих пор я сделал нулевые изменения в Web.config с момента создания приложения. – Ecnalyr

0

вы можете установить на каждом контроллере ViewData [ "Home"] = класс "activeTab", и использовать эту информацию в представлении.

Это сделает вкладку активной, если значение этого словаря данныхDataData. Прост и очень чист.

Внутри комплект контроллер ViewData как этот

ViewData["SomeTab"] = "activeTab"; 
    return View("Index"); 

сторона:

<li class="<@ ((string)ViewData["SomeTab"] ?? "") >"><@Html.ActionLink("SomeTab", "Index", "Home")></li> 
<li class="<@ ((string)ViewData["MyPage"] ?? "") %>"><@Html.ActionLink("MyPage", "MyPage", "")></li> 
+0

Спасибо, но я больше искал решение, которое полностью избегало контроллера. – Ecnalyr

Смежные вопросы