Как вы говорите, по вашему мнению, лучше избегать такой сложной логики. Насколько это возможно, вы должны передать вашему виду простые данные для отображения. Скорее всего, у вас всегда будут какие-то операторы if
и foreach
, но что-то более сложное, чем вы хотите избежать в значительной степени.
Лучше иметь доступ к данным и сборку ваших объектов в методе действия в вашем контроллере, а не в представлении, и обычно тогда даже эти операции могут быть переданы какой-либо другой службе (например, вызову репозиторий, вызов картографа.) В общем, вам также лучше передавать ViewModel
объекты на ваш взгляд, а не объекты прямо из вашего домена. (Хотя в этом случае, поскольку объекты всегда предназначены для отображения в любом случае, вы, вероятно, не слишком беспокоитесь об этом.)
Вы можете поместить все эти вещи в метод действия на вашем HomeController, если эти ссылки относятся только к домашней странице, или если это общесайтовое меню, у вас может быть отдельный NavController, чтобы специально работать с ним.
1010 *, например *
public class NavController : Controller
{
// ...
[ChildActionOnly]
public PartialViewResult SiteMenu(string currentPage)
{
// Get your flat list of menu items from the DB
var menuItems = _siteMapRepo.GetMenuItems();
// Map them into something more tree-like...
var treeMenu = MapFlatItemsToTreeMenu(menuItems);
return View("_Menu", treeMenu);
}
// ...
}
Тогда у вас может быть частичное представление, которое отображает их, например, _Menu.cshtml.
Тогда где-нибудь в родительском представлении, скорее всего, в макете вашего сайта, вы можете вызвать RenderAction
для вызова меню:
@{Html.RenderAction("SiteMap", "Nav");}
Код в _Menu.cshtml может стать интересным, поскольку вы имеете дело с древовидной структурой. У вас могут быть рекурсивные вызовы в вашем частичном представлении, с нижним расположением на конечных узлах, предпочтительно с использованием RenderPartial, а не RenderAction на этом этапе, поскольку RenderAction приводит к новому запросу. Что-то вроде ...
@model MenuItem
@if (Model.HasChildren)
{
<ul>
@foreach (var child in Model.Children)
{
@{Html.RenderPartial("_Menu", child);}
}
</ul>
}
else
{
<li>
// do something with Model.Url etc.
</li>
}
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: На самом деле я не пробовал это, просто выписал, но это должно дать суть, я надеюсь.
Вы также можете, конечно, посмотреть, если кто-то другой уже сделал что-то подобное, что вы можете использовать, например, MvcSiteMapProvider или MvcTreeView .