ViewContext.ParentActionViewContext имеет значение null при попытке доступа к родительскому ContentArea в EPiServer

Я пытаюсь использовать подход, показанный здесь, чтобы мои блоки в EPiServer могли запрашивать свой индекс в родительской ContentArea. Я уже делаю это в другом проекте (проект A) и сейчас пытаюсь сделать это снова в новом проекте (проект B). Но по какой-то причине в новом проекте ViewContext.ParentActionViewContext нулевой. Я начал сравнивать различия между ними, и я заметил в проекте А, IsChildAction верно и RouteData.DataTokens содержит только один ключ = 'ParentActionDataContext', но в проекте B, IsChildAction ложно и RouteData.DataTokens содержит все ключи для основного запроса. Итак, учитывая, что описание ParentActionViewContext свойство это:

Объект, который содержит информацию о контексте представления для родительского метода действия.

Имеет смысл, что в проекте B он будет нулевым, если нет дочерних действий. Проблема в том, что я не знаю, почему Project A выполняет рендеринг ContentArea как дочернее действие, а Project B - нет. Сравнивая стеки вызовов, я вижу, что они разветвляются в двух разных направлениях в сборке EPiServer (верхние 2 кадра каждого стека ниже):

Проект А

EPiServer.dll!EPiServer.Web.Mvc.PartialRequest.RenderAction(System.Web.Mvc.HtmlHelper helper, string action, string controller, object routeValues) Unknown
EPiServer.dll!EPiServer.Web.Mvc.MvcContentRenderer.Render(System.Web.Mvc.HtmlHelper helper, EPiServer.Web.Mvc.PartialRequest partialRequestHandler, EPiServer.Core.IContentData contentData, EPiServer.DataAbstraction.TemplateModel templateModel) Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.IContentDataExtensions.RenderContentData(System.Web.Mvc.HtmlHelper html, EPiServer.Core.IContentData contentData, bool isContentInContentArea, EPiServer.DataAbstraction.TemplateModel templateModel, EPiServer.Web.Mvc.IContentRenderer contentRenderer)  Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.ContentAreaRenderer.RenderContentAreaItem(System.Web.Mvc.HtmlHelper htmlHelper, EPiServer.Core.ContentAreaItem contentAreaItem, string templateTag, string htmlTag, string cssClass)   Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.ContentAreaRenderer.RenderContentAreaItems(System.Web.Mvc.HtmlHelper htmlHelper, System.Collections.Generic.IEnumerable<EPiServer.Core.ContentAreaItem> contentAreaItems)  Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.ContentAreaRenderer.Render(System.Web.Mvc.HtmlHelper htmlHelper, EPiServer.Core.ContentArea contentArea)   Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.ContentAreaExtensions.RenderContentArea(System.Web.Mvc.HtmlHelper htmlHelper, EPiServer.Core.ContentArea contentArea)  Unknown
App_Web_zaun2obg.dll!ASP.util_views_shared_displaytemplates_contentarea_ascx.__Render__control1(System.Web.UI.HtmlTextWriter __w, System.Web.UI.Control parameterContainer) Line 4  C#

Проект Б

EPiServer.dll!EPiServer.Web.Mvc.MvcContentRenderer.HandleRenderTemplateWithViewEngine(System.Web.Mvc.HtmlHelper helper, EPiServer.Core.IContentData contentData, EPiServer.DataAbstraction.TemplateModel templateModel) Unknown
EPiServer.dll!EPiServer.Web.Mvc.MvcContentRenderer.Render(System.Web.Mvc.HtmlHelper helper, EPiServer.Web.Mvc.PartialRequest partialRequestHandler, EPiServer.Core.IContentData contentData, EPiServer.DataAbstraction.TemplateModel templateModel) Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.IContentDataExtensions.RenderContentData(System.Web.Mvc.HtmlHelper html, EPiServer.Core.IContentData contentData, bool isContentInContentArea, EPiServer.DataAbstraction.TemplateModel templateModel, EPiServer.Web.Mvc.IContentRenderer contentRenderer)  Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.ContentAreaRenderer.RenderContentAreaItem(System.Web.Mvc.HtmlHelper htmlHelper, EPiServer.Core.ContentAreaItem contentAreaItem, string templateTag, string htmlTag, string cssClass)   Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.ContentAreaRenderer.RenderContentAreaItems(System.Web.Mvc.HtmlHelper htmlHelper, System.Collections.Generic.IEnumerable<EPiServer.Core.ContentAreaItem> contentAreaItems)  Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.ContentAreaRenderer.Render(System.Web.Mvc.HtmlHelper htmlHelper, EPiServer.Core.ContentArea contentArea)   Unknown
EPiServer.dll!EPiServer.Web.Mvc.Html.ContentAreaExtensions.RenderContentArea(System.Web.Mvc.HtmlHelper htmlHelper, EPiServer.Core.ContentArea contentArea)  Unknown
App_Web_myevwxkt.dll!ASP.util_views_shared_displaytemplates_contentarea_ascx.__Render__control1(System.Web.UI.HtmlTextWriter __w, System.Web.UI.Control parameterContainer) Line 4  C#

Но я называю оба одинаково:

Проект А:

@Html.PropertyFor(m => m.CurrentPage.WallBlocks)

Проект Б:

@Html.PropertyFor(m => m.CurrentPage.DepartmentalSupportBlocks)

Любая идея, что происходит или как я могу заставить его работать, чтобы я мог получить в родительском ContentArea в моем Html помощник?

1 ответ

Решение

Я нашел проблему. Я был прав, думая, что ParentActionViewContext был нулевым, потому что блок не выполнялся как дочерний вид. Кажется, причина в том, что в моем блоке не было контроллера. Похоже, что EPiServer будет отображать блоки, которые имеют контроллер, как дочерние действия, но те, у которых нет контроллера, как часть одного и того же запроса. Я предполагаю, что это причина, почему рекомендуется не использовать контроллер для ваших Блоков по соображениям эффективности. Однако, если вам нужна информация о родителе ContentAreaКажется, вам нужен контроллер.

PS Убедитесь, что вы возвращаете PartialView (...), а не View (...) со своего контроллера блоков, чтобы не тратить лишние пару часов, пытаясь понять, почему он кричит на вас, говоря:

Элемент модели, передаваемый в словарь, имеет тип "Castle.Proxies.[MyBlock]Proxy", но для этого словаря требуется элемент модели типа "[Тип модели макета по умолчанию]"

Другие вопросы по тегам