ViewContext.ParentActionViewContext 尝试访问 EPiServer 中的父 ContentArea 时为空

ViewContext.ParentActionViewContext is null when trying to access parent ContentArea in EPiServer

我正在尝试使用方法 shown here 来允许我在 EPiServer 中的块在父 ContentArea 中查询它们的索引。我已经在另一个项目(项目 A)中这样做了,现在正尝试在一个新项目(项目 B)中再次这样做。但是由于某种原因在新项目中,ViewContext.ParentActionViewContext 为空。我开始比较两者之间的差异,我注意到在项目 A 中,IsChildAction 是正确的,而 RouteData.DataTokens 仅包含一个键 = 'ParentActionDataContext',但在项目 B 中,IsChildAction为 false 并且 RouteData.DataTokens 包含主要请求的所有键。好的,鉴于 ParentActionViewContext 属性 的描述是:

An object that contains the view context information for the parent action method.

如果没有子操作,它在项目 B 中为 null 是有道理的。问题是,我不知道为什么项目 A 将 ContentArea 渲染为子动作而项目 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#

但我用同样的方式调用两者:

项目 A:

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

项目 B:

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

知道发生了什么事或如何使它工作以便我可以在我的 Html 助手中访问父 ContentArea 吗?

我发现了问题。我认为 ParentActionViewContext 为空是正确的,因为该块未作为子视图执行。原因似乎是因为我的街区没有控制器。看起来 EPiServer 会将具有控制器的块渲染为子动作,但将那些没有控制器的块渲染为同一请求的一部分。我想这就是为什么出于效率原因建议不要为您的 Blocks 使用控制器的原因。但是,如果您需要有关父项的信息 ContentArea,看来您确实需要一个控制器。

P.S。确保你的块控制器是 return PartialView(...) 而不是 View(...) 这样你就不会花额外的几个小时试图弄清楚为什么它对你大喊大叫

The model item passed into the dictionary is of type 'Castle.Proxies.[MyBlock]Proxy', but this dictionary requires a model item of type '[My default layout's model type]'