i am writing new asp.net mvc application and i have question about creating multi-level navigation system.
For example i have web with main navigation (Cpu — Gpu —- Ram)
and sub-navigation with (intel,amd — ati,nvidia — DDR2,DD3)
Well, my first implementation is here :
public class NavigationItem
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string Controller { get; set; }
public virtual string Action { get; set; }
public virtual string Url { get; set; }
public virtual string Section { get; set; }
}
public class NavigationController : Controller
{
private readonly IUnitOfWork _unitOfWork;
public NavigationController(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public ActionResult MainMenu()
{
return View(_unitOfWork.NavigationItems.Where(x => x.Section == null).ToList());
}
public ActionResult SectionMenu()
{
return View(_unitOfWork.NavigationItems.Where(x => x.Section == "// name of section").ToLis());
}
}
And finally my layout page is :
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
</head>
<body>
<div class="main-menu">
@{Html.RenderAction("MainMenu", "Navigation");}
</div>
<div class="section-menu">
@{Html.RenderAction("SectionMenu", "Navigation");}
</div>
@RenderBody()
</body>
</html>
With this implementation i have problem how i handle in SectionMenu with MainMenu is active, because i want generate SectionMenu depends on MainMenu and highlight them.
One workaround of witch i think is handle url(controller) in SectionMenu.
For example :
if (RouteData.Values["controller"].ToString() == "Administration")
{
// Generate section menu for Administration main menu
}
I dont like this solution because i work with “magic string” values and i havent only one controller per one MainMenu.
How implement this solution?
Thanks for advice
Ok, I use ViewBag feature. Not clean, but works