Как проверить, определена ли переменная в главном файле в ASP.NET MVC - PullRequest
0 голосов
/ 05 июня 2010

У меня есть файл Site.Master, который я создал, чтобы быть моим шаблоном для большинства сайтов с навигацией. Эта навигация создается динамически на основе рекурсивной сущности (называемой страницей) - страницы с parentID, равным 0, являются верхним уровнем, и, естественно, каждый дочерний элемент несет идентификатор своего родителя в этом поле.

Я создал небольшой маленький помощник HTML, который принимает идентификатор страницы и генерирует навигацию, выполняя foreach для дочерних элементов, у которых parentId соответствует переданному идентификатору. На большинстве сайтов я хочу, чтобы Site.Master использовал parentId, равный 0, но если я использую строго типизированное представление, отображающее страницу, я, естественно, хочу использовать идентификатор страницы.

Есть ли способ сделать такую ​​условную логику в Site.Master (и это нарушает правила MVC)? «Если я нахожусь на строго типизированной странице / Page / {Id}, используйте навигацию Id render, в противном случае используйте 0»

Ответы [ 2 ]

1 голос
/ 05 июня 2010

Разобрался:

        int navPageId = 0;
        if (ViewContext.RouteData.Values["controller"] == "Pages" && ViewContext.RouteData.Values["Id"] != null)
        {
            navPageId = Convert.ToInt32(ViewContext.RouteData.Values["Id"]);
        }
        Html.RenderNav(navPageId);
1 голос
/ 05 июня 2010

Похоже, ваш 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>
...