crm 2013 javascript save and refresh crashes

zab*_*bby 1 javascript refresh business-process dynamics-crm-2013

我目前拥有CRM 2013内部部署的开发环境.在我的自定义实体中,运行以下JavaScript代码:

function UpdateBPF() {
    var requests = [];
    requests.push(Xrm.Page.getAttribute('description').setRequiredLevel('none'));
    requests.push(Xrm.Page.getAttribute('categoryid').setRequiredLevel('none'));
    requests.push(Xrm.Page.getAttribute('priority').setRequiredLevel('none'));
    requests.push(Xrm.Page.getAttribute('initialtype').setValue(1));
    requests.push(Xrm.Page.data.save());
    requests.push(event.returnValue = false);

    $.when.apply(undefined, requests).always(function () {
        Xrm.Page.data.setFormDirty(false);
        RefreshForm();
    });
};

function RefreshForm() {
    Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId());
};
Run Code Online (Sandbox Code Playgroud)

我正在做的事情:

  • 在更改选项设置值时更改业务流程流

切换选项集后我的代码正在做什么:

  • 启动自定义工作流程以进行实际切换(工作正常,我需要刷新才能实际向用户显示所选工作流程)
  • 不需要某些字段(如果未填充则阻止刷新)
  • 保存表单(刷新后显示正确的业务流程,从未保存值,因此从未设置选项设置值)
  • 防止发生"你还没有保存"弹出窗口.(很可能我不再需要这个)
  • 我没有保存后将表单设置为不脏

为什么我将大部分步骤推入请求变量?

  • 我希望在刷新表单之前肯定会出现这些值.很可能我这样做不正确或效率不高.

什么有效:

  • 所有内容都按预期在我的CRM 2013内部部署测试环境中运行.
  • 保存
  • 刷新
  • 正确的业务流程和阶段

CRM 2013在线问题:

  • 保存和刷新不起作用
  • IE 9,10,11和FireFox完全崩溃.Chrome很好.
  • 关闭自动保存没有任何区别

我试过保存的内容:

  • Xrm.Page.data.save()
  • Xrm.Page.data.entity.save()

我尝试刷新的内容:

  • Xrm.Page.data.refresh()
  • Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
  • Xrm.Utility.openEntityForm("service_ticket", Xrm.Page.data.entity.getId(), null)
  • var url = Xrm.Page.context.getClientUrl(); window.open(url + "/main.aspx?etn=ticket&pagetype=entityrecord&id=" + Xrm.Page.data.entity.getId() + "&newWindow=false", "_blank", null, false);

当我调试时,一步一步地通过顶部发布的代码,它获得当时的.when,.apply和.always但SKIPS内部的一切.我认为这总意味着它总是运行...

当我尝试:

Xrm.Page.data.save().then(
    function () {
        alert('Save worked, refresh');
        Xrm.Page.data.refresh();
    },
    function () {
        alert('Save failed!');
    }
);
Run Code Online (Sandbox Code Playgroud)

单步执行代码就可以实现保存.但是在击中之后,它将SKIPS内部的所有内容然后IE(我主要测试的是因为Chrome似乎工作......),完全崩溃了.错误没有完全弹出,更多的是警告说"IE已经停止工作".

我在StackOverflow中看到过1个类似的问题,但没有接受的答案或答案对我来说根本不起作用.前两个段落之前的Xrm.Page.data.save()函数是其中一个答案的样本.超级简单的样品,易于遵循并逐步进行测试,结果无变化.

我也用谷歌搜索(我最好的朋友)甚至是我的问题.另一个网站上的另一个帖子,我相信在微软网站上,根本没有回复.根据所写的内容,我假设它与StackOverflow帖子的人员相同.

任何对问题的洞察,无论是我的代码还是其他东西,都非常感谢.

tl; dr保存和刷新JavaScript不适用于CRM 2013 Online

zab*_*bby 5

我最终做的是在Xrm.Page.data.save之前有一个setTimeout.似乎在字段更改之后和我的JavaScript之前直接发生了某些事情.它可能是业务规则(但我最初已将它们停用,因此有可能不是这样).

无论哪种方式,我为解决我的问题所做的是在短暂的超时内包含save函数,然后使用Xrm.Utility.openEntityForm来"刷新"整个页面,因为我宁愿不使用不支持的

Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
Run Code Online (Sandbox Code Playgroud)

以下是我使用的代码段:

setTimeout(function () {
    Xrm.Page.data.save().then(
        function () {
            var id = Xrm.Page.data.entity.getId();
            var entityLogicalName = Xrm.Page.data.entity.getEntityName();
            Xrm.Utility.openEntityForm(entityLogicalName, id);
        },
        function () {
            alert('Save failed! Please refresh the form.');
        });
}, 500);
Run Code Online (Sandbox Code Playgroud)

我在保存新创建的记录后获得记录的ID.超出超时或保存之前会导致打开一条新记录(基本上是Save + New).

如果有更有效的方法可以解决这个问题,请告知我,我会选择你的答案(如果有效)作为正确答案.

编辑:
以下代码实际上是一个更好的版本.之前的代码我做了Save and Save&Close,导致Save发生两次,这搞砸了我的一些不同项目的逻辑

setTimeout(function () {
    var id = Xrm.Page.data.entity.getId();
    var entityLogicalName = Xrm.Page.data.entity.getEntityName();
    Xrm.Utility.openEntityForm(entityLogicalName, id);
}, 500);
Run Code Online (Sandbox Code Playgroud)

在这里,openEntityForm是在关闭之前保存记录并再次打开自己,最接近我可以进入保存和刷新.