Xrm.Internal.openDialog打开对话框自定义页面

发布时间 2023-07-10 14:29:06作者: 流浪阿丁
在Dynamics CRM平台中使用自定义页面拓展功能实现有多种方式,比如嵌套iframe,比如直接打开一个新页面,再就是打开对话框了,对话框里为自定义页面。
调用方式很简单,先把自定义页面上传好后,直接使用Xrm.Internal.openDialog函数即可。
 
JS打开对话框方法一(注意参数要encodeURIComponent转码):
 1 //URL为上传好后的web资源地址
 2 let URL = Xrm.Page.context.getClientUrl() + "/WebResources/xxxx_xxxxhtml"
 3 let encodeParams = "entityName=" + entityName + "&entityId=" + entityId + "&business=" + business + "&bub=" + bub + "&kdFactoryId=" + kdFactoryId + "&productionFactoryId=" + productionFactoryId + "&packageFactoryId=" + packageFactoryId
 4     let ReturnMsg = null
 5     let DialogOption = new Xrm.DialogOptions
 6     DialogOption.width = 1000
 7     DialogOption.height = 700
 8     Xrm.Internal.openDialog(URL + "?Data=" + encodeURIComponent(encodeParams),
 9         DialogOption,
10         null, null,
11         function (returnValue) {
12             console.log(returnValue)
13             ReturnMsg = "{" + returnValue + "}";
14             if (Xrm.Page.getControl("kd_claimdetail")) {
15                 Xrm.Page.getControl("kd_claimdetail").refresh();
16                 Xrm.Page.data.refresh();
17             }
18         })
对应自定义页面获取取参数:
 1 let entityId = getParam("entityId")
 2 let entityName = getParam("entityName")
 3 let business = getParam("business")
 4 
 5 /**
 6              * 从URL中读取参数Data下的指定参数的值,如URL为【http://test.com?Data=name%3D%E6%82%A8%E5%A5%BD】
 7              * getParam('name')读取的为Data的值通过解码后,读取其中name参数的值
 8              */
 9             function getParam(param) {
10                 let htmlParameters = parseParams()
11                 return htmlParameters[param]
12             }
13             // 解析URL传入的参数
14             function parseParams() {
15                 var objData = {};
16                 var vals = decodeURIComponent(getParameter("Data")).split("&");
17                 for (var i = 0; i < vals.length; i++) {
18                     var pr = vals[i].replace(/\+/g, " ").split("=");
19                     if (pr.length != 2) {
20                         continue;
21                     }
22                     objData[pr[0]] = pr[1];
23                 }
24                 return objData;
25             }
26             //获得参数信息
27             function getParameter(param) {
28                 var query = window.location.search;
29                 var iLen = param.length;
30                 var iStart = query.indexOf(param);
31                 if (iStart == -1)
32                     return "";
33                 iStart += iLen + 1;
34                 var iEnd = query.indexOf("&", iStart);
35                 if (iEnd == -1)
36                     return query.substring(iStart);
37                 return query.substring(iStart, iEnd);
38             }

JS打开对话框方法二:

上面是把参数拼接到url中,需要单独在页面中封装解析参数的方法,实际上可以url直接接web资源地址,然后使用对话框参数。
1 let params = { 'id': EntityId, 'type': EntityName, 'status': status, 'roles': roles }
2     var DialogOption = new Xrm.DialogOptions
3     DialogOption.width = 750;
4     DialogOption.height = 550;
5 Xrm.Internal.openDialog("/WebResources/xxxx_xxxhtml", DialogOption, params, null, function (returnValue) {
6         console.log('调用成功 返回值:' + returnValue); //这里就可以接收到弹窗上面传过来的数组
7     });
在自定页面中可以直接获取参数:
1 //获取url参数
2  var id = window.getDialogArguments().id;
3  var type = window.getDialogArguments().type;
4  var str_status = window.getDialogArguments().status;
5  var roles = window.getDialogArguments().roles;

实现效果: