CRM和iframe aspx页面表单提交

时间:2014-05-05 04:04:30

标签: javascript asp.net iframe crm

场景:

我在aspx机会表单上Iframe需要CRM's页面。此aspx页面具有将数据提交到其他数据库的形式。

要求: 我想当用户点击CRM机会表单上的保存按钮时,aspx页面应该将数据存储在外部数据库中,机会表单也应保存CRM表单上的所有更改。

我的努力:

直到现在我在CRM表格上有iframed aspx页面。我也在使用OnSave事件提交表单。 但唯一的问题是表单被提交但是当它执行完整代码时,CRM表单会被刷新。最终结果是aspx页面上的数据不会存储在外部数据库中。

实现此功能的另一种可能方法是什么?

感谢您花时间阅读。提前谢谢。

1 个答案:

答案 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();
}