CRM提供了两种WCF Web Service,一个是Organization Service,使用的是SOAP协议,另一个是Organization Data Service,使用的是OData(REST)协议。我们在为CRM写插件(plugin)的时候,通常都要用到第一种web service,而在客户端进行编程的时候就要使用到Organization Data Service了。Organization Data Service提供了REST Endpoint,它只能用于你写JScript脚本,或者在Silverlight中使用。具体细节也可以参看sdk中“Use the REST Endpoint for Web Resources”一节。
在本文中,我给大家一段代码来演示如何使用REST Endpoint。在account表单上,如果更改primary contact,我们使用Organization Data Service来获取新contact的address1_city地址栏。
if (typeof (AccountLibrary) == "undefined") { AccountLibrary = { __namespace: true }; } AccountLibrary = { Name: "AccountLibrary", RetrieveContactCallBack: function (retrieveRecordsReq) { if (retrieveRecordsReq.readyState == 4 /* complete */) { if (retrieveRecordsReq.status == 200) { //Success var retrievedRecord = JSON.parse(retrieveRecordsReq.responseText).d; alert(retrievedRecord.Address1_City); } else { alert("Error : " + retrieveRecordsReq.status + ": " + retrieveRecordsReq.statusText + ": " + JSON.parse(retrieveRecordsReq.responseText).error.message.value); } } }, PrimaryContactOnChange: function () { if (Xrm.Page.getAttribute("primarycontactid").getValue()) { var contactid = Xrm.Page.getAttribute("primarycontactid").getValue()[0].id; var retrieveEntityReq = new XMLHttpRequest(); var ODataPath = Xrm.Page.context.prependOrgName("/xrmservices/2011/organizationdata.svc"); retrieveEntityReq.open("GET", ODataPath + "/ContactSet(guid'" + contactid + "')?$select=Address1_City", true); retrieveEntityReq.setRequestHeader("Accept", "application/json"); retrieveEntityReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); retrieveEntityReq.onreadystatechange = function () { AccountLibrary.RetrieveContactCallBack(this); }; retrieveEntityReq.send(); } } }
要注意:
(1)Address1_City是Schema Name而不是Field Name。如果使用的是Field Name(address_city1),我们会得到以下的错误信息。“Error : 400: Bad Request: Type 'Microsoft.Crm.Sdk.Data.Services.Contact' does not have a property named 'address1_city'.”
(2)我们在RequestHeader 中设置使用了json,所以不要忘记在web resource中引用json.js。我在另一篇文章《MS CRM 2011 实例 -- 添加Connect子选项 》中介绍了如何添加son.js,有兴趣的同学可以看一下。
(3) XMLHttpRequest.open的方法中,第三个参数是用来指定是同步还是异步的,true为异步,false为同步。什么是同步异步,不懂的同学可以在网上,比如w3school上搜索一下AJAX技术,就会了解了。另外为了优化用户使用性能,我比较推荐使用异步方式。
(4)在本文的例子中,我使用的是Retrieve方法,我在另一篇文章《MS CRM 2011 实例 -- 添加Connect子选项 》中还介绍了如何使用Retrieve Multiple方法,有兴趣的同学也可以去看一下。
本文转自JF Zhu博客园博客,原文链接: http://www.cnblogs.com/jfzhu/archive/2012/10/17/2728508.html ,如需转载请自行联系原作者