原创地址: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函数。

MS CRM 2011 Form与Web Resource在JScript中的相互调用相关推荐

  1. MS CRM 2011——让活动实体在活动菜单中显示

    在MS CRM 2011中,新建活动实体时,忘了勾选在菜单显示选项,导致在活动菜单中无法看到此活动实体,如果不想删除此实体重新新建,可以使用以下方法进行修改: 第一步:更改CRM数据库数据库 Meta ...

  2. MS CRM 2011插件调试工具

    在MS CRM 2011中调试插件Plugin是非常繁琐的一件事情--每次编译完成后,需要使用插件注册工具,更新Assembly,而后,将Debug目录中的pdb文件拷贝到%CRM安装目录%\Serv ...

  3. MS CRM 2011中,对于多实体数据文件的导入

    在之前的文章中,我已经介绍了如何使用MS CRM 2011中提供的数据管理功能完成数据的导入,有兴趣的同学可以看< MS CRM 2011 RC中的新特性(8)-数据管理>进行了解. 在实 ...

  4. MS CRM 2011 C#中获取Web Resource

    原创地址:http://www.cnblogs.com/jfzhu/archive/2013/02/15/2913077.html 转载请注明出处 我在以前的文章中讲过如何用JScript读取web ...

  5. MS CRM 2011的自定义与开发(2)——预备知识

    在真刀真枪开始自定义与开发之前,首先介绍一下需要用到的一系列术语等内容,以便后续的交流更加顺畅. 在MS CRM中,经常会说到实体Entity,属性Attribute以及关联Relationship, ...

  6. MS CRM 2011 用Jscript打开新窗口的几种方法

    在CRM中,我们经常遇到这样的情况,点击一个按钮,需要弹出一个新的窗口.比如在客户中添加新联系人: 在MS CRM2011中,有以下几种方法可以打开一个新的窗口: (1) Xrm.Utility.op ...

  7. MS CRM 2011 RC中的新特性(2)——销售自动化方面

    在MS CRM2011 RC版本中,销售自动化方面新增的特性主要商机产品部分的对目录外产品的处理. 在以往的版本中,不能够在商机阶段将目录外产品作为商机产品的一个组成部分进行管理,只有到报价单阶段,才 ...

  8. MS CRM 2011中的新特性(1)——界面部分

    MS crm2011中,在界面部分的调整包括有ribbon.入门窗格.最近访问列表.以及实例的表单方面的调整,下面一一介绍. Ribbon特性 MS CRM2011中,使用了Ribbon作为工作菜单的 ...

  9. MS CRM 2011 RC中的新特性(9)—全新的工作流 脚本设计模式

    MS Dynamics CRM 2011中,在流程处理方面,除了以往版本中具有的工作流之外,又加入了新的内容--脚本Dialog.脚本Dialog,是同步的.需要用户输入内容的流程.当启动了脚本后,系 ...

最新文章

  1. 服务器中anaconda如何修改环境变量,手动添加anaconda3到环境变量中的方法
  2. pytorch AUTOGRAD
  3. PetShop 4.0知识点:base 关键字用于从派生类中访问基类的成员
  4. Linux常用命令——cd
  5. 华硕开机画面修改_电脑开机密码忘记,进不了系统,一招教你轻松解决!
  6. android使用遥控器模拟鼠标拖拽操作
  7. 流程追踪_徐川江的博客_新浪博客
  8. java安装cab破损,Visual Studio 2005 Professional Edition损坏的CAB文件
  9. 推荐十本值得一读的AI书籍(留言送书)
  10. 解决OneNote复制 黏贴后是图片的问题?纯文本黏贴好用的免费软件
  11. 封闭解、解析解和数值解定义
  12. 好好生活,总会遇见美好事物
  13. [ app.json 文件内容错误] app.json: window.navigationBarTextStyle 字段需为 black,white【已解决】
  14. cocos2dx入门2:安装及基本介绍
  15. android 二进制 xml,如何将XML转换为Android二进制XML
  16. 济南哪个学校学计算机好,济南计算机专业哪些学校好
  17. 当痴女遇到渣男·《致我们终将逝去的青春》
  18. php-cs-fixer实践
  19. 完成贺年卡的编写(万能模板)
  20. python支持向量机回归_用Python实现支持向量机并处理Iris数据集

热门文章

  1. String equals()方法 源码分析
  2. ios 动画设计_动画和讲故事在设计中的力量
  3. NFS4文件锁机制探秘
  4. AsyncTask的使用半解--!
  5. DVWA系列之24 high级别上传漏洞
  6. vc++ mfc中拖动效果的实现 借助于CImageList
  7. 系统架构:Web应用架构的新趋势 前后端分离的想法
  8. spring cloud 总结
  9. Java-开源工具类
  10. 2016福州大学软件工程第四次团队作业-系统设计成绩汇总