应用程序使用一个按钮运行,该按钮使用Ribbon工作台添加到commandContainer,然后该按钮调用Xrm.Internal.openDialog
所有这一切都正常,直到我想开始使用Xrm.Page.Data公开的实体
基本上我的按钮在动态主页面的上下文中运行,但是实体在iframe中,基于我所在的页面具有不同的Id和名称.
所以使用一个简单的选择器我无法得到它的contentWindow并开始使用实体.
#crmContentPanel总是包含很少的iframe,从#contentIFrame0到#contentIFrame(n),我永远不知道哪个iframe是包含实体的iframe.
在此环境中开发应用程序的最佳实践和相关工作流程是什么?如何轻松可靠地访问保存主页面实体并使用它们的正确框架.
也许脚本位于错误的位置,需要注入主内容区域,以便直接访问正确的Xrm?我怎样才能做到这一点?
此外,一旦我最终设法访问这些数据,我怎样才能轻松地将这些数据传递给我在对话框中运行的角度应用程序,从我读到的文档中,对话框只允许1个查询字符串参数,并且必须将其称为数据.这对我的应用程序开始使用$routeParams来说是不够的.我不认为使用本地或会话存储是很好的做法.在这种情况下,正确的方法是什么.
我的按钮脚本的示例代码:
function runSendSender() { // Content Iframe Entity data: var contentFrameXrm = $('#crmContentPanel') .find("iframe#contentIFrame0...n")[0] .contentWindow['Xrm']; // even if above selector was consistent across pages // I need to send over much more than this one Id :( var data = contentFrameXrm.Page.data.entity.getId(); var src = "/WebResources/concep_/ConcepDynamicsApp/ConcepDynamicsApp.html?data=" + data; var Dialogoptions = new Xrm.Dialogoptions(); Dialogoptions.width = 800; Dialogoptions.height = 500; Xrm.Internal.openDialog(src,Dialogoptions,null,CallbackFunction); function CallbackFunction(returnValue) { } }
更多细节
当我在控制台中键入以下内容时,我有时(随机)读取表单的标题:
$('#crmContentPanel').find("iframe#contentIFrame0")[0].contentWindow['Xrm'].Page.ui.get_formTitle();
但是相关网络资源功能中的相同代码无法访问iframe和错误:
Can not Cannot read property 'contentWindow' of undefined.
为什么iframe无法通过资源脚本访问,如何访问正确的上下文和表单title / id.
解决方法
在您的情况下,参数值将是FirstPrimaryItemId(“提供一个GUID标识符作为正在查看的记录的字符串.”)
在那之后,你将改变你的功能
function runSendSender(recordId) { ... }
另外,要远离内部:要在对话框中打开Web资源,您应该使用the supported way(链接提供有关将除数据以外的参数传递给资源的信息).
Xrm.Utility.openWebResource(webResourceName,webResourceData,width,height)