Как проверить, определена ли переменная в главном файле в 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>
Другие вопросы по тегам