使用基于iframe的视图很难访问Dynamics 2013访问页面实体

Ali*_*deh 6 javascript angularjs dynamics-crm-2013

我正在构建一个角度应用程序,它在Dynamics 2013上作为Web资源运行.

应用程序使用一个按钮运行,该按钮使用Ribbon工作台添加到commandContainer,然后该按钮调用 Xrm.Internal.openDialog

所有这一切都正常,直到我想开始使用暴露的实体 Xrm.Page.Data

基本上我的按钮在动态主页面的上下文中运行,但是实体在iframe内,基于我所在的页面具有不同的Id和名称.

因此,使用简单的选择器我无法获取其contentWindow并开始使用实体.

该#crmContentPanel总是有它几个I帧开始从#contentIFrame0到#contentIFrame(n)和我永远无法知道哪个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, null, CallbackFunction);

    function CallbackFunction(returnValue) { }
}
Run Code Online (Sandbox Code Playgroud)

更多细节

当我在控制台中键入以下内容时,我有时(随机)读取表单的标题:

$('#crmContentPanel').find("iframe#contentIFrame0")[0].contentWindow['Xrm'].Page.ui.get_formTitle();
Run Code Online (Sandbox Code Playgroud)

但是相关网络资源功能中的相同代码无法访问iframe和错误:

Can not Cannot read property 'contentWindow' of undefined.
Run Code Online (Sandbox Code Playgroud)

为什么iframe无法通过资源脚本访问,如何访问正确的上下文和表单title/id.

shy*_*kov 5

我通常将以下JavaScript文件包含在需要访问CRM特定操作/信息的自定义WebResource的标题中:

<script src="ClientGlobalContext.js.aspx" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

这样可以访问某些非实体特定信息,例如Xrm.Page.context.getServerUrl()Xrm.Page.context.getUserId().

但是如果您iFrame在标准实体页面上添加了自己的图层,那么您肯定可以使用以下构造访问当前上下文下的信息:

window.parent.Xrm.Page.data.entity.attributes.get("name").getValue();
Run Code Online (Sandbox Code Playgroud)

注意window.parent前缀.


Ale*_*lex 3

记录 ID 可以作为runSendSender参数由功能区本身发送。只需将适当的CrmParameter( MSDN ) 添加到函数调用中即可。

在您的情况下,参数值将是FirstPrimaryItemId(“为正在查看的记录提供一个 GUID 标识符作为字符串。”)

之后,你的功能就会像这样改变

function runSendSender(recordId) { ... }
Run Code Online (Sandbox Code Playgroud)

另外,请远离内部:要在对话框中打开 Web 资源,您应该使用受支持的方式(链接提供有关传递参数而不是data资源的信息)。

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height)
Run Code Online (Sandbox Code Playgroud)