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", но для этого словаря требуется элемент модели типа "[Тип модели макета по умолчанию]"