【问题标题】:crm2011 plugin call js functioncrm2011插件调用js函数
【发布时间】:2013-03-27 08:40:02
【问题描述】:

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

我在 Internet 上找不到任何信息。大部分资源描述了如何从 JS 触发插件,但不是相反。

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

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);
            }
        }
    }

}

【问题讨论】:

  • 插件需要从服务器更新客户端上的 javascript 是为了什么?
  • 插件需要从 js web 资源运行一个函数。问题是我需要让这个函数在 onSave 事件之前运行,我不知道怎么做,我认为这是不可能的。我唯一能想到的就是编写一个可以运行 JS 脚本的插件。否则我觉得我必须在插件中复制 js 函数的行为。
  • 为什么你的javascript不能在表单的OnSave事件中运行?
  • 可以的。但正如我所见,它甚至会在 onSave 之后触发。首先表单保存并且JS运行。我需要在表单保存之前执行它。 Run onLoad 对我来说也不方便。实际上,我需要在更改与之相关并嵌入表单中的另一个实体时运行它,但该实体是系统实体,我无法修改它或在该实体中特定字段的更改时分配 JS
  • OnSave Javascript 事件在实际数据库更新/插件执行发生之前运行。

标签: javascript plugins call dynamics-crm-2011


【解决方案1】:

插件内不支持从服务器回调客户端的方式。我也不知道有任何不受支持的方式。

我认为这个问题甚至没有意义。插件仅在进行某种 CRUD 操作时触发。由 GUI 触发的任何 CRUD 操作都会以任何方式刷新实体。您可以通过 javascript 和 Odata 调用执行更新,但是一旦插件完成,您就可以运行任何您想要运行的 javascript。

【讨论】:

  • 好的。谢谢。这就是为什么我找不到任何东西
【解决方案2】:

没有(合理的)方法可以做到这一点。

原因是插件是一个服务器大小的执行对象。它甚至不能假设有一个 GUI。 (当然,我们知道,但一般来说,服务器大小的代码不能直接与 GUI 交互)。

JavaScript 是客户端代码,客户端假定为服务器。这就是(大致)为什么 JS 可以调用插件(虽然我不会这么说),但反过来不行。

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

【讨论】:

  • 我有一个表格。在此表单上,我有一个部分,用户可以在其中添加注释(注释)。我有一个已经写好的JS。此 JS 的一个功能是将注释中的一些参数复制到此表单上的另一个字段。我不想接触这个 JS,并且作为 C# 和插件的绝对新手,我要编写一个触发 JS 的插件会更容易编写一个访问实体复制数据并将其插入到不同位置的插件。这就是我问这个解决方案的原因。但是现在我看到我必须在插件中做所有事情
  • @AlexeyOmelchenko 我真的很了解你的想法。你和我的同事 Rickard 一样务实,我非常尊重他的财产。我真的希望可以按照您的建议进行操作。可悲的是,我不这么认为。无论如何,请继续寻找这些路径,因为这对客户来说是最便宜的方式。为此 +1。
  • 另外,请查看其中一个回复作为答案。这不是您想要的答案,但并非如此,的答案。建议您查看@Daryl 的回复,因为他的回复速度快了三个小时。该死的德克萨斯人! :)
  • 好的,谢谢。我已经回复他了。
  • @AlexeyOmelchenko 我没有说你需要回复。我的意思是你应该选择一个答案并“检查”它完成(左侧一个检查的东西会在你点击它时变成绿色。我们还鼓励你投票赞成/反对你喜欢的答案(和问题)通常通过单击左侧数字上方/下方的箭头。这是在 Stack Overflow 上说“谢谢”的正确方式。:)
猜你喜欢
  • 2015-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多