2016-09-23 82 views
0

我有以下js腳本,它可以在FormLoad事件的ms crm中工作。意外的調用方法或屬性訪問。 MS CRM

function showForm() { 
    if (Xrm.Page.ui.getFormType() == 2) { 
     Xrm.Page.ui.controls.get("pcrm_contactfield").setDisabled(true); 
     Xrm.Page.ui.controls.get("pcrm_privatefield").setDisabled(true); 
     return; 
    } 

    processField("contact", "pcrm_contactfield"); 
    processField("pcrm_userconnection", "pcrm_privatefield"); 
    var userName = ''; 
    var lblUser = parent.document.getElementById('lblUserName'); 
    if (lblUser != null) 
     if (typeof lblUser.innerText != "undefined") 
      userName = lblUser.innerText; 
     else 
      userName = lblUser.innerHTML; 
    else 
     userName = Xrm.Page.context.getUserName(); 

    if (!Xrm.Page.data.entity.getId()) { 
     var userControl = Xrm.Page.getControl("pcrm_userid"); 
     if (userControl) { 
      if (XrmServiceToolkit.Soap.IsCurrentUserRole("PCRM Connections Manager")) { 
       userControl.setDisabled(false); 
      } else { 
       var userAttribute = Xrm.Page.getAttribute("pcrm_userid"); 
       var lookupValue = { 
        id: Xrm.Page.context.getUserId(), 
        entityType: "systemuser", 
        name: userName 
       }; 
       userAttribute.setValue([lookupValue]); 
       userAttribute.setSubmitMode("always"); 
      } 
     } 
    } 
} 

function processField(entityName, field) 
{ 
    SDK.Metadata.RetrieveEntity(SDK.Metadata.EntityFilters.Attributes, entityName, null, false, 
    function (entityMetadata) { 
     entityMetadata.Attributes.sort(function (a, b) { 
      if (a.LogicalName < b.LogicalName) 
       return -1; 
      if (a.LogicalName > b.LogicalName) 
       return 1; 
      return 0; 
     }); 
     applySelect(field, entityMetadata.Attributes); 
    }, 
    function() { 
    }); 
} 

function applySelect(id, attributes) { 
    if (parent.document.getElementById(id + "_container")) 
     parent.document.getElementById(id + "_container").style.display = "none"; 
    else if (parent.document.getElementById(id)) { 
     parent.document.getElementById(id).style.display = "none"; 
     parent.document.getElementById(id + "_d").style.display.paddingLeft = "23px"; 
    } 

    var selectControl = "<select style='width: 100%' id ='" + id + "_select' onchange='onChange(this, \"" + id + "\")'><option></option>"; 
    var value = Xrm.Page.data.entity.attributes.get(id).getValue(); 

    for (var i = 0; i < attributes.length; i++) { 
     if (attributes[i].IsPrimaryId || attributes[i].AttributeType == "Lookup" || attributes[i].DisplayName.LocalizedLabels.length == 0) 
      continue; 

     var logicalName = attributes[i].LogicalName; 
     if (logicalName == "createdon" || logicalName == "modifiedon" || logicalName == "importsequencenumber" || 
      logicalName == "overriddencreatedon" || logicalName == "ownerid" || logicalName == "statecode" || logicalName == "statuscode" || 
      logicalName == "timezoneruleversionnumber" || logicalName == "utcconversiontimezonecode") 
      continue; 

     selectControl += "<option" + (value == logicalName ? " selected" : "") + " value='" + logicalName + "'>" + logicalName + " (" + attributes[i].DisplayName.LocalizedLabels[0].Label + ")</option>"; 
    } 
    selectControl += "</select>"; 

    parent.document.getElementById(id + "_d").innerHTML += selectControl; 
} 

parent.onChange = function (control, field) { 
    Xrm.Page.data.entity.attributes.get(field).setValue(control.value); 
} 

現在我解釋他在做什麼。我有形式,這個js代碼動態創建兩個元素<select>。此代碼還將元素與一些數據綁定。此功能適用於applySelect方法。
它的工作原理沒有錯誤。我可以選擇一些選項,點擊「保存」並創建新記錄。這是異步工作的。
但是,當調用另一個重定向到另一個頁面或刷新當前頁面的事件時會發生js錯誤。這隻在IE中複製,我不認爲這是MS CRM中的功能或錯誤。來自CRM的消息如下所示:

Microsoft Dynamics CRM Error Report Contents 

<CrmScriptErrorReport> 
    <ReportVersion>1.0</ReportVersion> 
    <ScriptErrorDetails> 
    <Message>Unexpected call to method or property access.</Message> 
    <Line>0</Line> 
    <URL>/form/page.aspx?lcid=1033&themeId=f499443d-2082-4938-8842-e7ee62de9a23&tstamp=513281&updateTimeStamp=636096333533056238&userts=131191056966436445&ver=-703338019#etc=10007&extraqs=%3fetc%3d10007&pagemode=iframe&pagetype=entityrecord&counter=1474641000171</URL> 
    <PageURL>/form/page.aspx?lcid=1033&themeId=f499443d-2082-4938-8842-e7ee62de9a23&tstamp=513281&updateTimeStamp=636096333533056238&userts=131191056966436445&ver=-703338019#etc=10007&extraqs=%3fetc%3d10007&pagemode=iframe&pagetype=entityrecord&counter=1474641000171</PageURL> 
    <Function>anonymous(dirtyVisiblePropertyData){var$v_0=dirtyVisiblePropertyData.getKeys();for(var$v_1=0;$v_1<$v_0.length;$v_1++){var$v_2=$v_0[$v_1];if(IsNull(this.get_viewMap().get_item($v_2))){}else{try{this.get_viewMap().get_item($v_2).update(dirtyVisiblePropertyD</Function> 
    <FunctionRaw>function(dirtyVisiblePropertyData) { 
     var $v_0 = dirtyVisiblePropertyData.getKeys(); 
     for (var $v_1 = 0; $v_1 < $v_0.length; $v_1++) { 
      var $v_2 = $v_0[$v_1]; 
      if (IsNull(this.get_viewMap().get_item($v_2))) { 
    </FunctionRaw> 
    <CallStack> 
    <Function>anonymous(dirtyVisiblePropertyData){var$v_0=dirtyVisiblePropertyData.getKeys();for(var$v_1=0;$v_1<$v_0.length;$v_1++){var$v_2=$v_0[$v_1];if(IsNull(this.get_viewMap().get_item($v_2))){}else{try{this.get_viewMap().get_item($v_2).update(dirtyVisiblePropertyData.get_item($v_2));}catch($v_3){Mscrm.CrmDebug.fail(String.format('ExceptionencounteredupdatingUIelement{0}:{1}',$v_2,$v_3.message));catchError($v_3.message,window.location.href,0,true);}}}}</Function> 
    <Function>anonymous(){if(this.$9i_1){var$v_0=this.$4M_1;this.$4M_1=new(Mscrm.TurboForm.Control.TypedDictionary$1.$$(Mscrm.TurboForm.Control.PropertyBag))();this.ui.updateUI($v_0);}}</Function> 
    <Function>anonymous(){this.$AC_1++;var$v_0=null;if(!this.$9V_1){$v_0=Xrm.Internal.startMetricsStopwatch(String.format('UIUpdate{0}',this.$AC_1));$v_0.start();}this.$8M_1=false;for(var$v_1=0;$v_1<this.$1w_1.length;$v_1++){var$v_2=this.$1w_1[$v_1];if(!IsNull($v_2)){$v_2.flushVisibilityChanges();}}if($v_0){$v_0.stop();}}</Function> 
    <Function>tryCommitActiveControl(keepFocus)</Function> 
    <Function>anonymous(action,isAutoSave,sync,shouldPromptOnDataLoss,saveOptions,saveAsCompleted){var$v_0=jQueryApi.jQueryDeferredFactory.Deferred(Mscrm.TurboForm.Control.EntityDataDescriptor,Mscrm.ErrorInformation);if(this.$7C_1){$v_0.reject(Mscrm.ErrorInformation.createErrorInfo((-1).toString(),Mscrm.TurboForm.Control.ErrorCode.toString(-1),null));return$v_0.promise();}this.$7C_1=true;if(!isAutoSave){tryCommitActiveControl(true);}var$v_1=this.$F1_1(action,isAutoSave);sync=(IsNull(sync))?false:sync;sync=(IsNullOrEmptyString(action))?sync:true;shouldPromptOnDataLoss=(IsNull(shouldPromptOnDataLoss))?true:shouldPromptOnDataLoss;var$v_2=newMscrm.TurboForm.Control.Data.EntitySaveEventArgs($v_1);if(IsNull(isAutoSave)){isAutoSave=false;}var$v_3=this.get_isNew();this.$8n_1=isAutoSave;var$v_4=this.$JO_1(isAutoSave,$v_2);if($v_4.$14_0){var$v_5=Mscrm.TurboForm.Control.CommandService.get_instance().handleSaveForScheduledEntities(Xrm.Page.data.entity.getEntityName(),saveOptions,$v_1,$v_0);if($v_5){this.$7C_1=false;return$v_0.promise();}var$$t_H=this;var$v_6=function($p1_0){$$t_H.$II_1($p1_0,$v_3);$v_0.resolve($p1_0);$$t_H.$An_1(action,$v_2,isAutoSave,shouldPromptOnDataLoss);$$t_H.$Hx_1();};var$$t_I=this;var$v_7=function($p1_0){if(isGlobalQuickCreate()){var$v_8=newXrm.SaveErrorResponse($p1_0.get_errorCode(),$p1_0.get_description(),$p1_0.get_serializedException());Mscrm.GlobalQuickCreate.GlobalQuickCreateBehavior.executeCallbacksAssociatedWithGlobalQuickCreate('savefailure',$v_8);}$v_0.reject($p1_0);};this.$L_1.$8_1.removeState(16);if(this.$L_1.$8_1===Mscrm.TurboForm.Control.PageManager.get_instance().$M_1){Mscrm.TurboForm.Control.CommandService.get_instance().save(this,sync,action).then($v_6,$v_7);}else{Mscrm.TurboForm.Control.CommandService.get_instance().quickFormSave(this,saveAsCompleted).then($v_6,$v_7);}}else{if(isAutoSave){Mscrm.TurboForm.Control.CommandService.get_instance().handleAutoSaveInvalid();}if($v_4.$3w_0===14){$v_0.resolve();this.$An_1(action,$v_2,isAutoSave,shouldPromptOnDataLoss);}elseif($v_4.$3w_0===13){$v_0.reject(Mscrm.ErrorInformation.createErrorInfo(saveCanceledErrorCodeAsString(),'',''));this.$An_1(action,$v_2,isAutoSave,shouldPromptOnDataLoss);}else{$v_0.reject();}}this.$7C_1=false;return$v_0.promise();}</Function> 
    <Function>anonymous(action,isAutoSave){this.saveInternal(action,isAutoSave);}</Function> 
    <Function>anonymous(action){this.$1T_1.save(action);}</Function> 
    <Function>anonymous(saveMode){if(Mscrm.InternalUtilities._String.isNullOrWhiteSpace(saveMode))Xrm.Page.data.entity.save();elseXrm.Page.data.entity.save(saveMode)}</Function> 
    <Function>anonymous(form){if(Mscrm.RibbonActions.isRefreshForm())Mscrm.CommandBarActions.saveForm("");elseMscrm.RibbonActions.saveLegacyForm(form,"Save")}</Function> 
    <Function>anonymous($p0,$p1,$p2,$p3){try{var$v_0=Mscrm.CommandHandler.$JQ($p1);Mscrm.CrmHeader.setScriptFile(Mscrm.CrmUri.create($p1.trim()),true,null,$v_0);var$v_1=!$v_0?window:Mscrm.Utilities.getTurboFormCustomScriptWindow();$v_0&&Xrm.Internal.trace.logT(Mscrm.CommandHandler,$p1+"isbeingloadedintoturboformscriptmanager");for(var$v_2=$p0.split("."),$v_3=0;$v_3<$v_2.length;$v_3++)if($v_1)$v_1=$v_1[$v_2[$v_3]];if(!IsNull($v_1)&&typeof$v_1==="function"){var$v_4=this.$Fa_1($p2,$p3);return$v_1.apply(null,$v_4)}returnnull}catch($v_5){returnnull}}</Function> 
    <Function>anonymous($p0,$p1,$p2,$p3){var$v_0=this.getCommandDefinition($p0,$p1);if(IsNull($v_0)||IsNull($v_0.Actions))returnfalse;for(var$v_1=0;$v_1<$v_0.Actions.length;$v_1++){var$v_2=$v_0.Actions[$v_1];switch($v_2.ActionType){case2:this.$GX_1($v_2.Attributes);break;case3:var$v_3=$v_2.Attributes;this.$Ce_1($v_3.FunctionName,$v_3.Library,$v_2.Parameters,$p2);break;case1:this.$GY_1($v_2.Attributes,$v_2.Parameters);break}}returntrue}</Function> 
    <Function>anonymous($p0,$p1,$p2){var$v_0=this.parseCommandFromRibbon($p0),$v_1=this.$Ag_1($v_0.command,$v_0.entityLogicalName,$p1,$p2),$v_2=$p1;if(!IsNull($v_2)&&!isNullOrEmptyString($v_2.PopulationXML)&&!$v_2.SuppressCommandIncludes){var$v_3=null;if($v_0.entityContext==="Form"){var$v_4=$find("crmFormSelector");if($v_4)$v_3=$v_4.get_currentFormId()}$v_2.PopulationXML=this.$Iq_1($v_2.PopulationXML,$v_0.entityLogicalName,$v_3)}return$v_1}</Function> 
    <Function>anonymous(command,properties){if(this.isControlEnabled(command)){if(!properties)properties={};this.get_$50_2().handleCommand(command,properties,0)}}</Function> 
    <Function>anonymous($p0,$p1){if(!IsNull(this.ribbonData)){if(IsNull($p1))$p1={};$p1["SourceControlId"]=IsNull(this.id)?$p0.id:this.id;var$v_0=this.getAttribute("CommandValueId");if(!IsNull($v_0))$p1["CommandValueId"]=$v_0;this.get_commandBar().$CU_4(.5);try{this.ribbonData.executeCommand(this.command,$p1);this.$5K_0&&Mscrm.RibbonManager.get_$3T().$z_1.executeCommand(this.command,$p1)}finally{this.get_commandBar().$CW_4(true)}}}</Function> 
    <Function>anonymous($p0,$p1){this.executeCommand($p0,null)}</Function> 
    <Function>anonymous(domEvent){var$v_0=Mscrm.Utilities.getDomEventElement(domEvent,"LI"),$v_1=this.$1T_4[$v_0.id];if($v_1)$v_1.click($v_0,domEvent);elseif(this.$7Q_4($v_0.id)){window.self.CommandBarMoreMenuLoadStartTime=(newDate).getTime();this.$I0_4(domEvent);window.self.CommandBarMoreMenuLoadEndTime=(newDate).getTime()}}</Function> 
    <Function>anonymous(){returnb.apply(a,arguments)}</Function> 
    <Function>anonymous(b){returne.call(a,newSys.UI.DomEvent(b))}</Function> 
    </CallStack> 
    </ScriptErrorDetails> 
    <ClientInformation> 
    <BrowserUserAgent>Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; rv:11.0) like Gecko</BrowserUserAgent> 
    <BrowserLanguage>en-US</BrowserLanguage> 
    <SystemLanguage>ru-RU</SystemLanguage> 
    <UserLanguage>en-US</UserLanguage> 
    <ScreenResolution>1920x1080</ScreenResolution> 
    <ClientName>Web</ClientName> 
    <ClienState>Online</ClienState> 
    <ClientTime>2016-09-23T17:30:33</ClientTime> 
    </ClientInformation> 
    <ServerInformation> 
    <OrgLanguage>1033</OrgLanguage> 
    <OrgCulture>1033</OrgCulture> 
    <UserLanguage>1033</UserLanguage> 
    <UserCulture>1033</UserCulture> 
    <OrgID>{E5438BCF-087C-E611-80CA-000C29135D52}</OrgID> 
    <UserID>{6A82F1DF-087C-E611-80CA-000C29135D52}</UserID> 
    <CRMVersion>8.0.1.79</CRMVersion> 
    </ServerInformation> 
</CrmScriptErrorReport> 

我在做什麼錯?如果可能,如何解決?

+0

您調試了嗎?你可以縮小你的代碼到最後幾行失敗的地方,並只發布相關行? – dynamicallyCRM

+0

是的,我做到了,但在ms crm的系統腳本後面發生了異常。只有在IE中才會出現異常。我認爲這是因爲IE將動態元素嵌入到DOM中。在我的代碼中,這發生在applySelect方法中。 – Seva

回答

1

您的代碼篡改了表單的DOM,這是不受支持的,應該避免,因爲它可能導致表單以不可預知的方式運行,並且在CRM更新Service Pack或新版本時也可能會中斷。

當您在表單上需要自定義HTML片段時,請改爲使用HTML Web資源。

相關問題