我目前拥有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());
};
我正在尝试做什么:
切换选项集后我的代码正在做什么:
为什么我将大部分步骤推送到请求变量?
什么有效:
CRM 2013在线问题:
我尝试过保存:
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!');
}
);
单步执行代码会点击保存。但是在击中之后,它将SKIPS内部的所有内容然后IE(我主要测试的是因为Chrome似乎工作......),完全崩溃了。错误没有完全弹出,更多的是警告“IE已经停止工作”。
我在StackOverflow中看到过1个类似的问题,没有接受的答案或答案根本不适用于我。前两个段落之前的Xrm.Page.data.save()函数是其中一个答案的样本。超级简单的样本,易于遵循和逐步进行测试,结果没有变化。
我也用谷歌搜索(我最好的朋友)甚至是我的问题。另一个网站上的另一个帖子,我相信在微软网站上,根本没有回复。根据所写的内容,我认为它与StackOverflow帖子的人员相同。
非常感谢对问题的任何洞察,无论是我的代码还是其他问题。
tl; dr保存并刷新JavaScript不适用于CRM 2013 Online
答案 0 :(得分:5)
我最终做的是在Xrm.Page.data.save之前有一个setTimeout。似乎在字段更改之后和我的JavaScript之前直接发生了某些事情。这可能是业务规则(但我最初已将它们停用,因此有可能不是这样)。
无论哪种方式,我为解决我的问题所做的是在短暂的超时内包含save函数,然后使用Xrm.Utility.openEntityForm来刷新"整个页面,因为我不想使用不支持的
Mscrm.ReadFormUtilities.openInSameFrame(window._etc, Xrm.Page.data.entity.getId())
以下是我使用的代码段:
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);
我在保存新创建的记录后获得记录的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);
这里,openEntityForm是在关闭之前保存记录并再次打开自己,最近的我可以到达Save&刷新。
答案 1 :(得分:0)
以下代码应与' onchange'相关联。修改过的事件'领域。修改过的'保存表单后,字段始终更新。因此,点击“保存'使用以下函数重新加载表单。
function ReloadFormAfterSave(eventArgs) {
var formId = Xrm.Page.ui.getFormType();
alert(formId);
if (formId == "2") { // in my case, I only want the reload to occur when updating
setTimeout(function () {
var id = Xrm.Page.data.entity.getId();
var entityLogicalName = Xrm.Page.data.entity.getEntityName();
Xrm.Utility.openEntityForm(entityLogicalName, id);
}, 500);
}
}
有关' modifiedon'
的说明,请参阅http://dynamicscrmtouch.wordpress.com/2014/07/05/onload-event-not-triggered-after-save-on-crm-2013/我忘了提到你需要添加' modifiedon'作为表单上的隐藏字段。
干杯!