在CRM中,我们经常遇到这样的情况,点击一个按钮,需要弹出一个新的窗口。比如在客户中添加新联系人:
在MS CRM2011中,有以下几种方法可以打开一个新的窗口:
(1) Xrm.Utility.openEntityForm
(2) window.open
(3) openObj
前两种是在SDK中支持的,尤其推荐使用第一种,但要注意Xrm.Utility这个对象只在Rollup 8以后的版本才支持。这里顺便列出来CRM 2011各个Rollup的版本号:
Build Version
RTM: 5.0.9688.583 (English)
Rollup 1 - 5.0.9688.1045 &">nbsp;
Rollup 2 - 5.0.9688.1155 -> CRM2011-Server-v2 - 5.0.9688.1157
Rollup 3 - 5.0.9688.1244
Rollup 4 - 5.0.9688.1450
Rollup 5 - 5.0.9688.1533
Rollup 6 - 5.0.9690.1992 -> has been re-released (original release version: 5.0.9689.1985)
Rollup 7 - 5.0.9690.2165
Rollup 8 - 5.0.9690.2243
Rollup 10 - 5.0.9690.2740 -> has been re-released (original release version: 5.0.9690.2730)
Note
Update Rollup 9 was not released because of a delay in the Q2 Service Update.
Update Rollup 10 fixes all the issues that would have been included in Update Rollup 9
下面来分别看一下这几个方法的使用:
(1) Xrm.Utility.openEntityForm
我们利用该方法来自己实现一个在客户中添加联系人的按钮。该方法具体参见SDK – “Set Field Values Using Parameters Passed to a Form”。
var parameters = {}; // Two Options 字段 parameters["donotemail"] = 1; // Text 字段 parameters["firstname"] = "Aaron"; parameters["lastname"] = "Babbitt"; // currency字段 parameters["creditlimit"] = 10000; // Option Set 字段 parameters["gendercode"] = 1; // Date 字段 parameters["birthdate"] = "1/31/1990"; // simple lookup parameters["preferredserviceid"] = "2CBBB5B6-DA13-E
211-905F-00155DA83B32"; parameters["preferredserviceidname"] = "Accountbezoek"; // customer lookup parameters["parentcustomerid"] = Xrm.
Page.data.entity.getId(); parameters["parentcustomeridname"] = Xrm.Page.getAttribute("name").getValue(); parameters["parentcustomer
idtype"] = "account"; // owner lookup parameters["ownerid"] = "D1655DCE-F90E-E211-905F-00155DA83B32"; parameters["owneridname"] = "Daisy Cabell"; parameters["owneridtype"] = "system
user"; Xrm.Utility.openEntityForm("contact", null, parameters);
注意partylist lookup和regarding lookup都不可以添加到openEntityForm 的参数中,因为partylist lookup和regarding lookup都是multiple lookup。
(2) window.open:
window.open方法虽然用起来不是很美观,但是可以控制feather(控制新窗口是怎样打开的),具体可以参见下面的例子。另外要注意参数要进行编码,这里用的是encodeURIComponent方法。在之前的文章中,我还介绍过使用CrmEncodeDecode.CrmNameValueEncode方法来进行编码。这两个方法都可以使用。解码的方法就分别为decodeURIComponent和CrmEncodeDecode.CrmNameValueDecode。
// Two Options 字段 var extraqs = "donotemail=1"; // Text 字段 extraqs += "&firstname=Aaron"; extraqs += "&lastname=Babbitt"; // currency字段 extraqs += "&creditlimit=10000"; // Option Set 字段 extraqs += "&gendercode=1"; // Date 字段 extraqs += "&birthdate=1/31/1990"; // simple lookup extraqs += "&preferredserviceid={2CBBB5B6-DA13-E211-905F-00155DA83B32}"; extraqs += "&preferredserviceidname=Accountbezoek"; // customer lookup extraqs += "&parentcustomerid=" + Xrm.Page.data.entity.getId(); extraqs += "&parentcustomeridname=" + Xrm.Page.getAttribute("name").getValue(); extraqs += "&parentcustomeridtype=account"; // owner lookup extraqs += "&ownerid={D1655DCE-F90E-E211-905F-00155DA83B32}"; extraqs += "&owneridname=Daisy Cabell"; extraqs += "&owneridtype=systemuser"; // Open the window. var
features = "location=no,menubar=no,status=no,toolbar=no"; window.open("/main.
aspx?etn=contact&pagetype=entityrecord&extraqs=" + encodeURIComponent(extraqs), "_blank", features, false);
(3) openObj:
这个方法在我之前的文章中也介绍过(是使用F12 Developer Tools工具来剖析出来的方法 )。由于这个方法并不被SDk所支持,所以还是建议大家使用前两种方法。