场景:
我在aspx
机会表单上Iframe
需要CRM's
页面。此aspx
页面具有将数据提交到其他数据库的形式。
要求:
我想当用户点击CRM机会表单上的保存按钮时,aspx页面应该将数据存储在外部数据库中,机会表单也应保存CRM
表单上的所有更改。
我的努力:
直到现在我在CRM
表格上有iframed aspx页面。我也在使用OnSave事件提交表单。
但唯一的问题是表单被提交但是当它执行完整代码时,CRM表单会被刷新。最终结果是aspx
页面上的数据不会存储在外部数据库中。
实现此功能的另一种可能方法是什么?
感谢您花时间阅读。提前谢谢。
答案 0 :(得分:0)
选项1:更好的解决方案是从机会事件后插件执行此操作。这可确保CRM与外部数据(如果需要)之间的数据一致性。您也可以使用WCF或Web服务将数据传输到外部数据库。
选项2:如果您必须使用javascript,您可以(1)绑定到机会表单OnSave,(2)阻止表单提交,(3)提交iframe和(4)等到它回来然后(5)做另一个保存以完成动作。但是,如果机会保存失败,这可能会导致CRM与外部数据库之间出现不一致。
这是一个伪代码示例
function OpportunityOnLoad() {
IFRAME.OnReadyStateChange = function() {
// (4) Check success if possible
// (5) unbind save event and complete the opportunity save
Form.RemoveOnSave(OpportunityOnSave)
Form.Save();
}
//OnLoad
Form.AddOnSave (OpportunityOnSave);
}
function OpportunityOnSave(context) {
//(1) Save clicked
//(2) Stop save
context.PreventDefault();
//(3) Submit iframe form
IFRAME.Submit();
}
编辑: 关于Q1:遗憾的是没有。 关于Q2:
这是上述概念到Javascript和CRM客户端API的粗略翻译。 我没有测试它,但它应该让你走上正确的轨道。
更改参数以匹配iframe ID,网址等。 此外,由于您使用的是aspx,您可能会遇到跨域问题,如果您正在浏览IE,则可以轻松克服这个问题,如果您使用CROME则不会轻易克服。
var IFRAME, SaveMode;
var FORM = Xrm.Page.data.entity;
var UI = Xrm.Page.ui;
var SaveModes = {
1 : "save",
2 : "saveandclose",
59: "saveandnew"
}
var Params = {
IframeBaseUrl : "",
IframeId : "IFRAME_test",
IframeFormId : "form1"
}
function OpportunityOnLoad() {
var sUrlparams = "?"; //add required params after ?
var IframeUrl = Params.IframeBaseUrl + sUrlParams;
IFRAME = UI.controls.get(Params.IframeId);
IFRAME.setSrc(IframeUrl);
IFRAME.Dom = document.getElementById(Params.IframeId);
IFRAME.add_readyStateComplete(OnAfterIfameSave);
FORM.addOnSave(OpportunityOnSave);
}
function OnAfterIfameSave() {
//SubmitSuccess indicates that the form has reloaded after a
//successful submit. You'll need to set this variable inside your iframe.
if (IFRAME.contentWindow.SubmitSuccess) {
FORM.removeOnSave(OpportunityOnSave);
FORM.save(SaveModes[SaveMode]);
}
}
function OpportunityOnSave(execObj) {
var evArgs = execObj.getEventArgs();
evArgs.preventDefault();
SaveMode = evArgs.getSaveMode();
IFRAME.contentWindow.document
.getElementById(Params.IframeFormId)
.Submit();
}