我正在尝试使用此处显示的方法允许我在EPiServer中的块在父ContentArea中查询其索引。我已经在另一个项目(项目 A)中执行此操作,现在正在尝试在新项目(项目 B)中再次执行此操作。但由于新项目中的某种原因,ViewContext.ParentActionViewContext
为空。我开始比较两者之间的差异,我注意到在项目 A 中,IsChildAction
是正确的,RouteData.DataTokens
只包含一个键 = 'ParentActionDataContext',但在项目 B 中,IsChildAction
是假的,RouteData.DataTokens
包含主请求的所有键。好的,所以给定ParentActionViewContext
属性的描述是:
一个对象,包含父操作方法的视图上下文信息。
如果没有子操作,则在项目 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 助手中访问父内容区吗?
我发现了问题。我认为ParentActionViewContext
为空是正确的,因为该块未作为子视图执行。原因似乎是因为我的块没有控制器。看起来 EPiServer 会将具有控制器的块呈现为子操作,但那些没有控制器的块作为同一请求的一部分。我想这就是为什么出于效率原因,建议不要为您的块使用控制器的原因。但是,如果您需要有关父ContentArea
的信息,似乎确实需要一个控制器。
附言:确保从块控制器返回 PartialView(...) 而不是 View(...),这样你就不会花额外的几个小时试图弄清楚为什么它会对你大喊大叫说,
传递到字典中的模型项的类型为 '城堡.代理。[我的块]代理",但此字典需要一个模型 类型为"[我的默认布局的模型类型]"的项目