跨应用渲染时2sxc视图丢失应用上下文问题
问题描述
站点上有两个独立的2sxc应用:App1和App2。App1的某个内容类型通过String dropdown-query字段获取App2中实体的GUID。
在App1的视图中,通过该GUID调用App.Query能正常获取并显示App2的实体数据:
// App1 View ... var getPlaylist = App.Query["Get Playlist by GUID"]; getPlaylist.Params("PlaylistId", "16705"); var playlist = AsList(getPlaylist["Default"]).First(); // 成功获取App2的实体数据 <p>@playlist.EntityTitle</p> // 能正常显示App2的数据
尝试在App1视图中渲染App2的视图,并传入查询到的实体数据时,实体内容能正常显示,但App2的上下文丢失:工具栏点击报错,对App2设置或资源的引用返回空值,错误信息如下:
Had an error talking to the server (status 400), Message: Bad Request Detail: Object reference not set to an instance of an object.
请问如何在App1视图中保留App2的上下文,或至少让工具栏正常工作?
解决方案
1. 使用App.View方法加载App2视图
直接用2sxc内置的跨应用视图加载方法,它会自动维护目标应用的上下文,是最推荐的方案:
// 在App1视图中获取App2实例(用应用名称或ID均可) var app2 = Apps.GetApp("Artifact-Library"); // 渲染App2的目标视图并传入实体数据 @app2.View("_ResourcesDownload", new { Content = playlist })
2. 手动传递App2上下文(兼容RenderPage场景)
如果必须使用RenderPage,需要手动将App2的上下文对象传入视图,让视图能识别所属应用:
var app2 = Apps.GetApp("Artifact-Library"); @RenderPage("/portals/0/2sxc/Artifact-Library/_ResourcesDownload.cshtml", new { Content = playlist, App = app2, Context = app2.Context })
注意:需要修改App2的视图代码,确保使用传入的App对象而非全局默认的App实例(如果原视图依赖全局App)。
3. 修正实体的应用关联(修复工具栏核心问题)
工具栏报错的根源是实体的AppId关联的是App1而非App2,手动修正实体的应用ID即可让工具栏请求指向正确的应用:
var app2 = Apps.GetApp("Artifact-Library"); var playlist = AsList(getPlaylist["Default"]).First(); // 绑定实体到App2的上下文 playlist.Entity.AppId = app2.AppId;
之后再渲染视图,工具栏生成的请求会自动关联到App2,避免400错误。
内容的提问来源于stack exchange,提问作者Zachary
相关产品推荐
相关产品推荐

