У меня есть следующая структура страницы в Umbraco:
- Домашняя страница
- Управление устройствами
- Ресурсы
- Руководства
- Загрузки
- Положения и условия
В моем шаблоне Master.cshtml есть меню навигации, которое является частичнымбазовый шаблон всех этих страниц.В этом фрагменте я вызываю Model.Content.Site().Children
, чтобы получить все узлы «Управление устройствами» и «Ресурсы», а затем повторяю, чтобы получить любые их узлы-потомки.
Это все работало нормально, когда все страницы использовали один и тот же документВведите (ChildNodeSelectionPage
), но теперь я изменил домашнюю страницу, чтобы использовать производную форму этого типа документа (CustomChildNodeSelectionPage
) для дополнительного свойства, и мне пришлось создать фиктивный контроллер (CustomChildNodeSelectionPageController
) в моем проекте, который выводитот оригинального ChildNodeSelectionPageController
, так что модель Master
по-прежнему передается обратно в представление.
Эта часть также, кажется, работает нормально (на основании попадания точек останова в исходный контроллер), но проблема возникает, когдапросмотр поразил: теперь, по неизвестной причине, Model.Content.Site().Children
имеет счетчик 0 на домашней странице, но все же, если перейти к URL-адресу любой из дочерних страниц, это 2 (как и ожидалось).
Также обратите внимание, что в домашнем документе по-прежнему используется шаблон ChildNodeSelectionPage.cshtml
, хотя его тип документа теперь был изменен на использование «Страницы выбора настраиваемого дочернего узла»).
Master.cshtml (примечание: для краткости нерелевантный код опущен)
@inherits Umbraco.Web.Mvc.UmbracoViewPage<Web.Portal.Models.Master>
<!DOCTYPE html>
<html>
<body>
@Html.Partial("Navigation Menu")
@RenderBody()
</body>
</html>
Меню навигации.cshtml
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@using Umbraco.Web
@using Umbraco.Web.Models
@helper AddMenuItems(IEnumerable<IPublishedContent> menuItems)
{
if (menuItems.Any())
{
<ul>
@foreach (var menuItem in menuItems)
{
<li>
@if (menuItem.Id == UmbracoContext.PageId)
{
@menuItem.Name
}
else
{
<a href="@menuItem.Url" title="@menuItem.GetPropertyValue("description")">@menuItem.Name</a>
}
@AddMenuItems(menuItem.Children)
</li>
}
</ul>
}
}
//NOTE: This is where the problem is when called from the `CustomChildNodeSelectionPage`.
@AddMenuItems(Model.Content.Site().Children)
ChildNodeSelectionPage.cshtml
@inherits Umbraco.Web.Mvc.UmbracoTemplatePage
@{
Layout = "Shared/Master.cshtml";
}
//NOTE: Irrelevant code omitted for brevity.
ChildNodeSelectionPageController
public class ChildNodeSelectionPageController : RenderMvcController
{
private ActionResult Index(IPublishedContent content, CultureInfo currentCulture)
=> CurrentTemplate
(
new Master
(
content,
currentCulture,
new Company(0, "ACME"),
new[]
{
new Company(0, "ACME"),
new Company(1, "Jimbo Jones' Jimbo Burgers Inc.")
},
"Jiminy Jilikers"
)
);
public override ActionResult Index(RenderModel model)
=> Index
(
model.Content,
model.CurrentCulture
);
}
CustomChildNodeSelectionPageController
//Exists only so that the new Document Type can call Index on ChildNOdeSelectionPageController.
public class CustomChildNodeSelectionPageController : ChildNodeSelectionPageController
{
}