Как проверить, определена ли переменная в главном файле в ASP.NET MVC
У меня есть файл Site.Master, который я создал, чтобы быть моим шаблоном для большинства сайтов с навигацией. Эта навигация создается динамически на основе рекурсивной сущности (называемой страницей) - страницы с родительским идентификатором, равным 0, являются верхним уровнем, и, естественно, каждый дочерний элемент несет идентификатор своего родителя в этом поле.
Я создал небольшой помощник HTML, который принимает идентификатор страницы и генерирует навигацию, выполняя foreach для дочерних элементов, у которых parentId соответствует переданному идентификатору. На большинстве сайтов я хочу, чтобы Site.Master использовал parentId, равный 0, но если я использую строго типизированное представление, отображающее страницу, я, естественно, хочу использовать идентификатор страницы.
Есть ли способ сделать такую условную логику в Site.Master (и это нарушает правила MVC)? "Если я нахожусь на строго типизированной странице /Page/{Id}, используйте навигацию Id render, иначе используйте 0"
2 ответа
Догадаться:
int navPageId = 0;
if (ViewContext.RouteData.Values["controller"] == "Pages" && ViewContext.RouteData.Values["Id"] != null)
{
navPageId = Convert.ToInt32(ViewContext.RouteData.Values["Id"]);
}
Html.RenderNav(navPageId);
Похоже, ваш PageID полезен только в контроллере страниц.
Рассмотрите возможность передачи PageID через ViewData
в ваш взгляд. Главная страница может просто проверить, существуют ли ViewData, и при необходимости вызвать ваш вспомогательный метод Html.
Контроллер страниц:
ViewData["PageID"] = somePageID; //zero or non-zero.
Мастер: когда какой-либо контроллер контроллера передает значение в ViewData для PageID, будет записан фрагмент HTML. Когда он не пройден, это недорогая проверка на ноль.
<% if (ViewData["PageID"] != null)
{
Response.Write(Html.RenderNav(ViewData["PageID"]));
}
%>
Этот стиль, для меня, имеет больше смысла. PagesController передает простое значение в ViewData
,
Сравните это с главной страницей, пытающейся при каждом запросе определить: что это за URL, кто такой Контроллер, хорошо, теперь иди и получи PageID, если он числовой, хорошо, теперь напиши HTML. Вся эта логика не принадлежит представлению. Как гласит соглашение: держи взгляды немыми.
Не используйте это в строго типизированных ViewModels, а используйте в ViewData
, Таким образом, это простая проверка на существование в Мастере, которая НЕ является строго типизированной.
Я предполагаю, что ViewData
Стратегия легче понять и поддерживать.
Звучит так, что вы хотите записать эту Навигацию в Мастер. Возможно, рассмотрите возможность перемещения его в область содержимого, где представление имеет мелкий контроль над тем, что появляется?
Просмотр страниц:
<asp:Content ID="nav" ContentPlaceHolderID="PagesNavContent" runat="server">
<%= Html.RenderNav(ViewData["PageID"])%>
</asp:Content>