Code Copied

CRM Open带自定义参数的Url

1. 打开Url的两种方式

在CRM中打开自定义参数的Url, 有两种方式:

1. 使用Xrm.Utility.openWebResource方法

2. 使用javascript的window.open方法

Url可能是一个CRM的html webresource,也可能来源于外部系统的一个网页。

Xrm.Utility.openWebResource方法本质上仍然是window.open方法,但CRM对window.open的Url参数做了一些限制(主要是参数名称限制)。
接下来介绍这2种方式的用法,以及如何用window.open方法突破CRM的参数限制。

2. 使用Xrm.Utility.openWebResource

方法说明

Xrm.Utility的方法介绍请参考MSDN的链接:

http://msdn.microsoft.com/en-us/library/jj602956.aspx

Xrm.Utility.openWebResource最多提供了4个参数,最少1个参数,webResourceName参数是必要参数,后面3个则为可选参数。

Xrm.Utility.openWebResource(webResourceName,webResourceData,width, height)

在使用Xrm.Utility之前需要先引用ClientGlobalContext.js.aspx,该文件的绝对路径为:http://host/orgname/_common/ClientGlobalContext.js.aspxhttp://host/_common/ClientGlobalContext.js.aspx

例如:http://localhost:5555/CrmOrg/_common/ClientGlobalContext.js.aspx或http://localhost:5555/_common/ClientGlobalContext.js.aspx。

实现步骤

将准备好的XrmOpenUrl.html和XrmTargetWindow.html上传到Solution中。

本例中,我创建了1个自定义的Solution,用于存放需要用到的webresource文件。

image

image

在Account Form中添加一个Tab,将其命名为XrmOpenUrl,然后把new_XrmOpenUrl.html文件插入到该Tab中。

image

在自定义Form后,必须要Save和Publish。

打开Account Form,点击Open按钮

image

在new_XrmTargeWindow.html画面能够看到每个参数的值都被页面接收了。

image

请注意new_XrmTargetWindow.html的Url参数,所有的参数都是经过encode的。

实现代码

XrmOpenUrl.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript" src="../../_common/ClientGlobalContext.js.aspx"></script>
    <script type="text/javascript">
        
        var myData = { sonpoId: 111111, dealerCode: 222222, storeCode: 333333, businessCode: 444444, generalInputData: 555555, pastingData: 666666 };

        function Open() {
            var parameters = encodeURIComponent("sonpoId=" + myData.sonpoId
             + "&dealerCode=" + myData.dealerCode
             + "&storeCode=" + myData.storeCode
             + "&businessCode=" + myData.businessCode
             + "&generalInputData=" + myData.generalInputData
             + "&pastingData=" + myData.pastingData);

            Xrm.Utility.openWebResource("new_XrmTargetWindow.html",parameters,1024,768);

        }
    </script>
</head>
<body>
    <input id="openBtn" type="button" value="Open" onclick="Open()"/>
</body>
</html>

XrmTargetWindow.html

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">

        function getUrlRequest() {
            // 或取当前页面的Url
            var url = location.search;
            var data = decodeURIComponent(url.substring(url.indexOf('Data=') + 5));
            var theRequest = new Object();
            var parameters = data.split('&');
            // 循环分解参数的key, value
            for (var i = 0; i < parameters.length; i++) {
                var pair = parameters[i].split('=');
                var key = pair[0];
                var value = pair[1];
                theRequest[key] = value;
            }
            return theRequest;
        }

        window.onload = function () {

            var request = getUrlRequest();
            var myData = {
                sonpoId: request['sonpoId'],
                dealerCode: request['dealerCode'],
                storeCode: request['storeCode'],
                businessCode: request['businessCode'],
                generalInputData: request['generalInputData'],
                pastingData: request['pastingData']
            };

            // 将参数值输出到页面
            document.getElementById('result').innerHTML = "SonpoId:" + myData.sonpoId + "<br />"
            + "dealerCode:" + myData.dealerCode + "<br />"
            + "storeCode:" + myData.storeCode + "<br />"
            + "businessCode:" + myData.businessCode + "<br />"
            + "generalInputData:" + myData.generalInputData + "<br />"
            + "pastingData:" + myData.pastingData + "<br />";
        }

    </script>
</head>
<body>
    <p id="result">
    </p>
</body>

在CRM中Open Url时,自定义参数都需要encode,否则会出现500的错误。也就是说CRM不支持自定义的参数键值对。
使用Xrm.Utility.openWebResource传入自定义参数时,CRM会使用Data参数来存储encode过的参数信息。
这也就是XrmTargetWindow.html所做的2个步骤:(1) 获取Data参数 (2)将Data参数的值decode后再获取实际需要的参数。

错误的示例演示

如果在new_XrmOpenUrl.html中直接添加自定义参数

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript" src="../../_common/ClientGlobalContext.js.aspx"></script>
    <script type="text/javascript">
        
        var myData = { sonpoId: 111111, dealerCode: 222222, storeCode: 333333, businessCode: 444444, generalInputData: 555555, pastingData: 666666 };

        function Open() {
            var parameters = "sonpoId=" + myData.sonpoId
             + "&dealerCode=" + myData.dealerCode
             + "&storeCode=" + myData.storeCode
             + "&businessCode=" + myData.businessCode
             + "&generalInputData=" + myData.generalInputData
             + "&pastingData=" + myData.pastingData;

            Xrm.Utility.openWebResource("new_XrmTargetWindow.html?" + parameters, null, 1024, 768);

        }
    </script>
</head>
<body>
    <input id="openBtn" type="button" value="Open" onclick="Open()"/>
</body>
</html>

则会出现参数无法识别的错误。

image

原因:在请求CRM的webresource时,并不是直接请求webresource,而是先请求通过WebResource.ashx处理请求。WebResource.ashx仅有几个固定的参数,如果请求传入的参数不在固定参数之列,则会产生该异常。

WebResource可接收的参数

参考:http://technet.microsoft.com/en-us/library/gg309536.aspx

Parameter Name Description

typename

Entity Name

The name of the entity.

type

Entity Type Code

An integer that uniquely identifies the entity in a specific organization.

id

Object GUID

The GUID that represents a record.

orgname

Organization Name

The unique name of the organization.

userlcid

User Language Code

The language code identifier being used by the current user.

orglcid

Organization Language Code

The language code identifier that represents the base language for the organization.

data

Optional Data Parameter

An optional value that may be passed.

formid

Form Id

The GUID that represents a form ID.

entrypoint

Entry Point

A string value. This parameter is intended to be passed as an optional value to web resources opened as custom help content for an entity. When enabled, custom help url will include a value of either ‘form’ or ‘hierarchychart’. More information: Add custom help content.

pagemode

 

For internal use only.

security

 

For internal use only.

tabSet

 

For internal use only.

3. 使用window.open方法

Xrm.Utility.openWebResource仅提供了有限的几个参数,如果我们要为open的窗体限定滚动条、位置等窗体个性化属性,显然该方法不符合我们的要求。
要实现这样的要求,还是需要使用javascript最原始的window.open(url, name, parameters)方法。

  • url参数是要打开的窗体
  • name用于指定打开窗体的名称
  • parameters指定打开窗体的属性,例如滚动条、位置、长宽等属性

上面也介绍了WebResource可接收的参数,现在我们要做的无非是在url中添加Data参数,并将encode过后的实际参数作为值赋给Data参数。

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script type="text/javascript">
        
        var myData = { sonpoId: 111111, dealerCode: 222222, storeCode: 333333, businessCode: 444444, generalInputData: 555555, pastingData: 666666 };

        function Open() {
            var parameters = encodeURIComponent("sonpoId=" + myData.sonpoId
             + "&dealerCode=" + myData.dealerCode
             + "&storeCode=" + myData.storeCode
             + "&businessCode=" + myData.businessCode
             + "&generalInputData=" + myData.generalInputData
             + "&pastingData=" + myData.pastingData);

            window.open("new_JsTargetWindow.html?Data=" + parameters,
            "JS Open CRM Web Resource",
            "menubar=no, toolbar=no, location=no,directories=no, status=no, scrollbars=no, titlebar=yes, resizable=no, height=768 ,width=1024,top=0,left=0");
            
        }
    </script>
</head>
<body>
    <input id="openBtn" type="button" value="Open" onclick="Open()"/>
</body>
</html>

运行结果如下

image

image

image

4. Solution下载

本文所用的源码都放在CRM的Solution中,下载链接:http://blog.64cm.com/source/CRM2011/OpenUrlSolution_1_0_0_0.zip