1

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

包含父操作方法的视图上下文信息的对象。

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

但我以同样的方式称呼两者:

项目一:

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

项目B:

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

知道发生了什么或如何使其工作,以便我可以在我的 Html 帮助程序中访问父 ContentArea 吗?

4

1 回答 1

1

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

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

传入字典的模型项的类型为“Castle.Proxies.[MyBlock]Proxy”,但此字典需要类型为“[我的默认布局的模型类型]”的模型项

于 2016-03-03T17:39:18.723 回答