Umbraco中Macro嵌套调用报无PublishedContentRequest错误如何解决
错误原因
你遇到的报错是因为@Umbraco.RenderMacro方法默认依赖当前请求上下文的PublishedContentRequest对象,在Macro内部嵌套调用时,上下文会丢失,导致Umbraco判定当前没有合法的渲染请求,抛出异常。
可行解决方案
下面按实现复杂度从低到高给出可选方案:
- 方案1:将子宏改为普通Partial View调用(最推荐)
如果你的StartPracticingButton宏没有用到Umbraco后台的宏权限控制、缓存配置等专属能力,直接把它的代码抽成普通Partial View,存放在~/Views/Partials/目录下,在父宏里直接调用即可,完全绕开上下文依赖问题:
// 替换原来报错的RenderMacro行 @Html.Partial("StartPracticingButton", new { nodeid = Model.Content.Id })
子Partial View里可以直接用@model dynamic接收传递的参数,或者定义强类型模型接收。
- 方案2:直接渲染子宏对应的Partial View
如果不想改现有子宏的结构,可以直接调用子宏对应的Partial View文件,手动构造宏参数模型传入,效果和RenderMacro完全一致,不需要走上下文检查:
// 替换原来报错的RenderMacro行,注意路径要和你实际子宏的Partial路径一致 @Html.Partial("~/Views/MacroPartials/StartPracticingButton.cshtml", new Umbraco.Web.Macros.PartialViewMacroModel( Model.Content, 0, // 子宏的ID,不需要后台宏配置的话填0即可 new System.Collections.Generic.Dictionary<string, object> { {"nodeid", Model.Content.Id} } ) )
- 方案3:手动补全上下文(不推荐,仅做兼容参考)
如果一定要用RenderMacro方法,可以在调用前手动初始化上下文的PublishedContentRequest,但这种方法有小概率会和全局上下文冲突,仅做兼容参考:
// 调用RenderMacro前先执行这段代码 @{ if (UmbracoContext.Current.PublishedContentRequest == null) { UmbracoContext.Current.PublishedContentRequest = new Umbraco.Web.Routing.PublishedContentRequest( new Uri(Model.Content.Url, UriKind.RelativeOrAbsolute), UmbracoContext.Current, Model.Content ); } } // 再调用原来的RenderMacro就不会报错 @Umbraco.RenderMacro("StartPracticingButton", new ViewDataDictionary { { "nodeid", Model.Content.Id } })
内容的提问来源于stack exchange,提问作者Roei Grinshpan
相关产品推荐
相关产品推荐

