2013-03-25 55 views
2

如何使用CRM2011中的插件从适当的web资源运行JavaScript函数。crm2011插件调用js函数

我在因特网上找不到任何信息。大多数资源描述了如何从JS触发插件,但不是相反的。

这里是JS代码taht复制笔记到说明字段。 单击保存时。您可以看到数据正确显示在说明字段中。但是,如果按保存并关闭并再次打开表单,说明字段将为空。 我认为这是因为JS在安全事件后执行,但后来的测试表明它是错误的。有人能指出这个JS代码中的错误导致数据没有保存吗? 或者给出一个建议如何编写一个从相关实体中检索数据并将其写入表单中的字段的插件。感谢名单

enter image description here

function copyNotes() 
{ 
// CLEAR DESCRIPTION FIELD 
alert("JS"); 
    Xrm.Page.getAttribute("description").setValue(''); 
// GET ID OF THE CASE AND CLEAN IT AND GET URL for oData stuff 
//THEN CALL RETRIEVE FUNCTION 
    var caseID = Xrm.Page.data.entity.getId(); 
    caseID = caseID.replace('{', '').replace('}', ''); 
    var oDataPath = Xrm.Page.context.getServerUrl() + "/xrmservices/2011/organizationdata.svc"; 
    ODataPath = Xrm.Page.context.getServerUrl() + "/XRMServices/2011/OrganizationData.svc"; 
    retrieveRecord(caseID); 
} 
// CREATE AN HTTP REQUEST AND SEND IT 
function retrieveRecord(Id) { 

var retrieveReq = new XMLHttpRequest(); 
retrieveReq.open("GET", ODataPath + "/AnnotationSet?$filter=ObjectId/Id" + " eq (guid'" + Id + "')", true); 

retrieveReq.setRequestHeader("Accept", "application/json"); 
retrieveReq.setRequestHeader("Content-Type", "application/json; charset=utf-8"); 
retrieveReq.onreadystatechange = function() { 
// THIS HANDLES A CALLBACK 
     retrieveReqCallBack(this); 
    }; 
    retrieveReq.send(); 
} 

function retrieveReqCallBack(retrieveReq) { 
    if (retrieveReq.readyState == 4 /* complete */ ) 
{ 
     if (retrieveReq.status == 200) { 
      //Success 
      var retrieved = this.parent.JSON.parse(retrieveReq.responseText).d; 
// ITERATE THROUGH THE NOTES FOR THIS CASE 
      for (var i = 0; i < retrieved.results.length; i++) { 
// IF IS AN EMPTY FIELD ADD 'case details:' 
       if (Xrm.Page.getAttribute("description").getValue() == null || Xrm.Page.getAttribute("description").getValue() == 'null') { 
        Xrm.Page.getAttribute("description").setValue('Case details:'); 
       } 
       // BOF PARSE DATE 
       var date = retrieved.results[i].CreatedOn; 
       date = new Date(parseInt(date.replace("/Date(", "").replace(")/", ""), 10)); 
       // EOF PARSE DATE 
       var newtext = "--------------------\r\n" + "Created by: " + retrieved.results[i].CreatedBy.Name + " - " + date + "\r\n" + retrieved.results[i].NoteText + "\r\n--------------------\r\n"; 
       var text = Xrm.Page.getAttribute("description").getValue() + "\r\n" + newtext; 
       Xrm.Page.getAttribute("description").setValue(text); 
      } 
     } 
    } 

} 
+0

你想要完成一个插件需要从服务器更新客户端上的JavaScript? – Daryl 2013-03-25 03:19:09

+0

插件需要运行js web资源中的一个函数。问题是我需要让这个函数在onSave事件之前运行,我不知道如何,我认为这是不可能的。我唯一能想到的就是编写一个可以运行JS脚本的插件。否则,我觉得我必须在插件中复制js函数的行为。 – Alexey 2013-03-25 03:35:56

+0

为什么你的JavaScript不能在窗体的OnSave事件中运行? – Daryl 2013-03-25 03:42:55

回答

3

有从服务器从插件中调用返回给客户端没有支持的方法。我也不知道有任何不支持的方式。

我不认为这个问题更有意义。当某种类型的CRUD操作发生时插件的唯一触发器。任何由GUI触发的CRUD操作都将导致实体刷新。你可以通过javascript和Odata调用来执行更新,但是一旦插件完成,你可以运行任何你想运行的JavaScript。

+0

好的。谢谢。这就是为什么我找不到任何东西 – Alexey 2013-03-25 03:37:31

2

没有(合理)的方式来做到这一点。

原因是插件是服务器大小执行的事情。它甚至不能假设有一个GUI。 (当然,我们知道但通常情况下,服务器大小的代码不能直接与GUI进行交互)。

JavaScript是客户端代码,客户端承担服务器。这(大致)是为什么JS可以调用一个插件(尽管我不会这么说),但不是相反。

我从来没有需要这样的操作,所以我很好奇你的任务是什么。你是在问纯粹的学术兴趣还是它是设计的一部分?也许有更好的方法来实现你的目标?

+0

我有一个表格。在这个表格中,我有一个部分,用户可以添加一个注释(注释)。我有一个已经写好的JS。这个JS的一个功能是将一些参数从笔记复制到这个表单上的另一个字段。我不想接触这个JS,并且在C#和绝对的新手中,我试图写一个触发JS的插件会更容易,编写一个插件来访问实体复制数据并将其插入到不同的地方。这就是为什么我问这个解决方案。但现在我看到我必须在插件中做所有事情 – Alexey 2013-03-26 00:34:53

+0

@AlexeyOmelchenko我真的在挖掘你的想法。你和我的同事瑞克德一样务实,我对这个财产非常尊重。我真的希望能够做你的建议。可悲的是,我不认为这是事实。永远不要低于这些痕迹,因为这对顾客来说是最便宜的方式。 +1。 – 2013-03-26 00:45:13

+0

另外,请检查其中一个答复作为答案。这不是你想要的答案,但不是那么少,**是答案。可以推断,你应该通过@Daryl查看回复,因为他的回复时间快了三个小时。达恩德州人! :) – 2013-03-26 00:49:44