MS CRM 2011 Form与Web Resource在JScript中的相互调用
原创地址:http://www.cnblogs.com/jfzhu/archive/2013/02/14/2912580.html
转载请注明出处
在Form中可以添加一个html的web resource,在web resource里可以用JScript来使用REST Endpoint或者SOAD Endpoint。
你可以在Form中添加一个web resource,也可以为Form添加一个指向某web resource的Navigation Link。
不论是以哪种方式,web resource可以用parent.window.Xrm来获得CRM Form中的Xrm对象。举一个小例子,在account的Form中添加一个html的web resource bm_ContactReadPane.htm来模拟出一种类似Outlook的Read Pane的功能:选择不同的primary contact,web resource就显示出相应的contact的full name和 business phone。
bm_ContactReadPane.htm代码:
<html> <head> <title></title> <script src="ClientGlobalContext.js.aspx"></script> <script type="text/jscript" src="bm_ContactReadPane.js"></script> <script type="text/jscript" src="bm_json.js"></script> <style type="text/css"> td { font-family: Segoe UI, Tahoma, Arial; font-size: 11px } </style> </head> <body onload="ContactReadPaneLibrary.OnLoad()"> <div> <table> <tr> <td>Full Name:</td> <td><input id="TextFullname" type="text" disabled="disabled" /></td> </tr> <tr> <td>Business Phone:</td> <td><input id="TextBusinessPhone" type="text"/></td> </tr> <tr> <td></td> <td><input id="TextHiddenId" type="text" style="display:none"/></td> </tr> </table> </div> </body> </html>
要注意上面代码中对<script src="ClientGlobalContext.js.aspx"></script>的引用,引用了它以后才可以使用CRM的REST Endpoint或者 SOAP Endpoint。如果你的web resource为bm_html/ContactReadPane.htm,那么引用就要改为script src="../ClientGlobalContext.js.aspx"></script>,注意文件夹的结构。
bm_ContactReadPane.js的代码:
if (typeof (ContactReadPaneLibrary) == "undefined") { ContactReadPaneLibrary = { __namespace: true }; } ContactReadPaneLibrary = { Name: "ContactReadPaneLibrary", OnLoad: function () { if (parent.window.Xrm.Page.getAttribute("primarycontactid").getValue() != null && parent.window.Xrm.Page.getAttribute("primarycontactid").getValue().length > 0) { var primartycontact = parent.window.Xrm.Page.getAttribute("primarycontactid").getValue()[0]; var contactid = primartycontact.id; var oDataPath = Xrm.Page.context.prependOrgName("/xrmservices/2011/organizationdata.svc"); var filter = "/ContactSet(guid'" + contactid + "')?$select=ContactId,Telephone1,FullName"; var retrieveRecordsReq = new XMLHttpRequest(); retrieveRecordsReq.open("GET", oDataPath + filter, true); retrieveRecordsReq.setRequestHeader("Accept", "application/json"); retrieveRecordsReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); retrieveRecordsReq.onreadystatechange = function () { ContactReadPaneLibrary.RetrieveContactCallBack(this); }; retrieveRecordsReq.send(); } else { document.getElementById("TextFullname").value = ""; document.getElementById("TextBusinessPhone").value = ""; document.getElementById("TextHiddenId").value = ""; } }, RetrieveContactCallBack: function (retrieveRecordsReq) { if (retrieveRecordsReq.readyState == 4 /* complete */) { if (retrieveRecordsReq.status == 200) { //Success //alert(retrieveRecordsReq.responseText); if (retrieveRecordsReq.responseText) { var retrievedRecord = JSON.parse(retrieveRecordsReq.responseText).d; document.getElementById("TextFullname").value = retrievedRecord.FullName; document.getElementById("TextBusinessPhone").value = retrievedRecord.Telephone1 == null ? "" : retrievedRecord.Telephone1; document.getElementById("TextHiddenId").value = retrievedRecord.ContactId; } } else { alert("Error : " + retrieveRecordsReq.status + ": " + retrieveRecordsReq.statusText + ": " + JSON.parse(retrieveRecordsReq.responseText).error.message.value); } } } }
account Form中的代码,PrimaryContactOnChange为account的primary contact onchange的 event handler。
if (typeof (AccountLibrary) == "undefined") { AccountLibrary = { __namespace: true }; } AccountLibrary = { Name: "AccountLibrary", PrimaryContactOnChange: function () { var contactReadPane = Xrm.Page.getControl("WebResource_ContactReadPane").getObject().contentWindow; var contactReadPane2 = Xrm.Page.getControl("WebResource_ContactReadPane2").getObject().contentWindow; contactReadPane.location.reload(); contactReadPane2.ContactReadPaneLibrary.OnLoad(); } }
我在account的form中添加了两个web resource,一个在更改form的primary contact的value以后需要刷新,另一个不需要刷新。
Form中的script调用web resource中的script,要使用对象Xrm.Page.getControl("WebResource_ContactReadPane").getObject().contentWindow。contactReadPane.location.reload()实现web resource的刷新,contactReadPane2.ContactReadPaneLibrary.OnLoad()是AJAX的实现,不需刷新,直接更改Full Name和Business Phone。
最后看一下效果图:
总结:web resource中的JScript需要用parent.window.Xrm来获得CRM Form中的Xrm对象,而CRM Form中的JScript需要使用Xrm.Page.getControl("WebResource_ContactReadPane").getObject().contentWindow对象来刷新web resource或调用web resource中的JScript函数。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构