我尝试使用方法shown here来允许EPiServer中的块在父ContentArea中查询其索引。我已经在另一个项目(项目A)中执行此操作,现在我正尝试在新项目(项目B)中再次执行此操作。但由于某些原因,在新项目中,ViewContext.ParentActionViewContext
为空。我开始比较两者之间的差异,我在项目A中注意到,IsChildAction
为真,RouteData.DataTokens
只包含一个键=' ParentActionDataContext',但在项目B中,{{ 1}}为false,IsChildAction
包含主请求的所有键。好的,因为RouteData.DataTokens
属性的描述是:
包含父操作方法的视图上下文信息的对象。
如果没有子操作,它在Project B中将为null是有意义的。问题是,我不知道为什么Project A执行将ContentArea渲染为子动作但Project B不执行。比较调用堆栈,我可以看到它在EPiServer程序集中的两个不同方向上分支(下面每个堆栈的前2帧):
项目A
ParentActionViewContext
项目B
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#
但我以同样的方式打电话:
项目A:
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#
项目B:
@Html.PropertyFor(m => m.CurrentPage.WallBlocks)
知道发生了什么或者我如何使它工作以便我可以在我的Html助手中找到父ContentArea?
答案 0 :(得分:0)
我发现了问题。我认为ParentActionViewContext
为空是正确的,因为块没有作为子视图执行。原因似乎是因为我的块没有控制器。看起来EPiServer将呈现具有控制器作为子动作的块,但是那些没有控制器作为同一请求的一部分的块。我想这就是为什么建议不要因为效率原因而不为Block使用控制器的原因。但是,如果您需要有关父ContentArea
的信息,您似乎确实需要一个控制器。
P.S。确保从块控制器返回PartialView(...)而不是View(...),这样你就不会花费额外的几个小时来弄清楚为什么它会对你大喊大叫,
传递到字典中的模型项是类型的 'Castle.Proxies。[MyBlock] Proxy',但这本词典需要一个模型 '[我的默认布局的模型类型]'
类型的项目