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

简介:

在Form中可以添加一个html的web resource,在web resource里可以用JScript来使用REST Endpoint或者SOAD Endpoint。

 

你可以在Form中添加一个web resource,也可以为Form添加一个指向某web resource的Navigation Link。

image

image

 

不论是以哪种方式,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函数。










本文转自JF Zhu博客园博客,原文链接: http://www.cnblogs.com/jfzhu/archive/2013/02/14/2912580.html  ,如需转载请自行联系原作者




相关文章
|
6月前
An error happened during template parsing (template: “ServletContext resource [/WEB-INF/templates/in
An error happened during template parsing (template: “ServletContext resource [/WEB-INF/templates/in
|
6月前
Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
|
1月前
|
Java 应用服务中间件 Spring
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
【终极解决方案】Could not open ServletContext resource [/WEB-INF/dispatcher-servlet.xml]
26 0
|
4月前
|
移动开发 前端开发 JavaScript
Web表单(Form)开发实战指南
【7月更文挑战第8天】表单(Form)是Web应用程序中不可或缺的组成部分,用于收集用户输入的数据。本指南将详细介绍HTML表单的基本结构、数据提交方式、表单验证以及如何使用JavaScript和CSS增强表单的交互性和美观性。
182 0
|
5月前
|
机器学习/深度学习 运维 Serverless
函数计算产品使用问题之打开SD web UI域名时显示resource throttled,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
移动开发 前端开发 数据安全/隐私保护
Web网页制作-知识点(2)——常用文本标签、列表标签、表格标签、Form表单、块元素与行内元素(内联元素)
Web网页制作-知识点(2)——常用文本标签、列表标签、表格标签、Form表单、块元素与行内元素(内联元素)
42 0
|
前端开发 Java Spring
解决Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/Servlet
解决Caused by: java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/Servlet
357 0
|
数据库 数据安全/隐私保护 UED
表单处理(Form Handling):构建用户互动的Web应用的关键技巧
在Web应用程序开发中,表单是与用户互动最频繁的一种元素之一。而表单处理是使用户能够输入、提交和处理数据的关键技术。在本博客中,我们将深入探讨表单处理的概念、不同类型的表单元素、表单验证、表单提交和最佳实践,以及如何有效地使用表单处理来构建具有强大用户互动性的Web应用。
115 0
An error happened during template parsing (template: “ServletContext resource [/WEB-INF/templates/in
学习An error happened during template parsing (template: “ServletContext resource [/WEB-INF/templates/in
203 0
An error happened during template parsing (template: “ServletContext resource [/WEB-INF/templates/in
Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】
Could not open ServletContext resource [/WEB-INF/springmvc-servlet.xml]【解决方案】

热门文章

最新文章