2

カスタム エンティティ、MFA にバージョン管理機能を追加しようとしていますが、非常に奇妙な問題が発生しています。フォームの onSave イベントとカスタム リボン ボタンのアクションの 2 つの場所から呼び出される JavaScript Web リソースがあります。具体的には、onSave イベントは captureSave を呼び出し、リボン ボタンは makeARevision を呼び出します。

保存ボタン/イベントから呼び出されると、すべてが期待どおりに機能します。新しい変更を含むすべての情報が新しいレコードにプルされ、そこに保存されますが、元のレコードは変更が保存されず、保存のプロンプトも表示されずに閉じられます。ただし、カスタム リボン ボタンから呼び出された場合、保存されていない変更は新しいレコードに引き継がれず、古いレコードは保存を要求します。さらに、ユーザーが変更を古いレコードに保存することを選択した場合でも、変更は保存されず、フォームは自動的に閉じません。

次のコードは、問題の Web リソースです。company_MFASaveOrRevise は、レコードを保存するか、新しいリビジョンを作成するかをユーザーに尋ねる単なる html ページです。違いの原因や解決方法についてのアイデアは大歓迎です。

function captureSave(executionContext) {
    if (Xrm.Page.ui.getFormType() != 1 && Xrm.Page.data.entity.getIsDirty()) {
        var retVal = showModalDialog(Xrm.Page.context.getServerUrl() + '/Webresources/company_MFASaveOrRevise', null, 'dialogWidth: 300px; dialogHeight: 100px');
        if (retVal == "Revise") {
            executionContext.getEventArgs().preventDefault();
            makeARevision();
        }
        else if (retVal == "Save") {
        }
    }
}

function createLookupValue(oldLookup) {
    var lookupVal = new Object();
    lookupVal.Id = oldLookup.id;
    lookupVal.LogicalName = oldLookup.entityName;
    lookupVal.Name = oldLookup.Name;
    return lookupVal;
}

function makeARevision() {
    var revisedMFA = {};
    revisedMFA['company_mfaname'] = Xrm.Page.data.entity.attributes.get('company_mfaname').getValue();
    revisedMFA['company_mfadate'] = Xrm.Page.data.entity.attributes.get('company_mfadate').getValue();
    revisedMFA['company_estimatedliqdate'] = Xrm.Page.data.entity.attributes.get('company_estimatedliqdate').getValue();
    revisedMFA['company_actualliqdate'] = Xrm.Page.data.entity.attributes.get('company_actualliqdate').getValue();
    revisedMFA['company_mfanumber'] = Xrm.Page.data.entity.attributes.get('company_mfanumber').getValue();
    revisedMFA['company_revisionno'] = Xrm.Page.data.entity.attributes.get('company_revisionno') == null ? 0 : Xrm.Page.data.entity.attributes.get('company_revisionno').getValue() + 1;
    revisedMFA['company_requester'] = createLookupValue(Xrm.Page.data.entity.attributes.get('company_requester').getValue()[0]);
    revisedMFA['company_mfapreviousrev'] = Xrm.Page.data.entity.attributes.get('company_totalmfatodate').getValue();
    revisedMFA['company_contract'] = createLookupValue(Xrm.Page.data.entity.attributes.get('company_contract').getValue()[0]);

    $.ajax({
        type: 'POST',
        contentType: 'application/json; charset=utf-8',
        datatype: 'json',
        url: getODataUrl() + '/' + 'company_mfaSet',
        data: JSON.stringify(revisedMFA),
        beforeSend: function (XMLHttpRequest) {
            //Specifying this header ensures that the results will be returned as JSON.
            XMLHttpRequest.setRequestHeader('Accept', 'application/json');
        },
        success: function (data, textStatus, request) {
            Xrm.Utility.openEntityForm("company_mfa", data.d.company_mfaId.toUpperCase());
            var attributes = Xrm.Page.data.entity.attributes.get();
            for (var i in attributes) {
                attributes[i].setSubmitMode('never');
            }
            Xrm.Page.ui.close();
        },
        error: function (request, textStatus, errorThrown) {
            alert(errorThrown);
            //alert("There was an error creating the revision");
        }
    });
}

編集:私はdebugger;さまざまな場所に挿入し、VS2012 デバッガーを使用していましたが、送信しないように属性が適切に設定されていることがわかりましたが、確認ダイアログがポップアップするのを止めなかったようです (webresource が呼び出されたときに機能しますが)保存ボタンから)。さらに、Xrm.Page.data.entity.attributes.get(attributeName)onSave イベント中に呼び出された場合は変更後の値を返しますが、リボンから呼び出された場合は変更前の値を返します。私はまだそれを修正する理由や方法を知りません。他に探すべきものはありますか?

4

1 に答える 1

0

リボンから呼び出されたときにコードをデバッグするには、F12 を使用します (リボンにあるので、JavaScript コードは動的スクリプト/スクリプト ブロックになります)。

于 2013-04-25T19:15:16.193 に答える