2016-02-22 3 views
0

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

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

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

Проект A

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# 

Проект B

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) 

Проект B:

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

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

ответ

0

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

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

Модель пункт передается в словарь имеет тип «Castle.Proxies. [MyBlock] Прокси», но этот словарь требует модель элемент типа "[модель моего размещения по умолчанию тип]

+0

Чтобы получить больше информации, что происходит под капотом: вы можете прочитать больше здесь - http: //blog.tech-fellow.нетто/2015/05/30/контент-зонные под капотом части-2/# whathappensaftertemplateisselected –

Смежные вопросы