无法验证保存新记录

时间:2017-08-29 05:37:11

标签: salesforce visualforce apex salesforce-communities

Salesforce Guru:

我正在编写Salesforce visualforce页面扩展控制器,以在其中实现验证和其他业务逻辑。但是,我的代码无法正常工作。似乎从未达到验证子类别和序列号的代码。系统调试日志显示子类别始终为null,尽管我在VF页面中有输入值。你能帮忙吗?非常感谢你!

public class CaseCreationExtension {
    ApexPages.StandardController stdCtrl;
    Case newCase;

    public CaseCreationExtension(ApexPages.StandardController controller){
        if (!Test.isRunningTest()){
            controller.addFields(new List<String>{'Categ__c', 'Sub_Category__c', 'Id', 'Serial_Number__c', 'Refund_Required__c', 'Total_Value__c', 'Per_Month__c'});
            system.debug('AddFields');
        }
        system.debug('Initial Controller');
        this.stdCtrl = controller;
        newCase = (Case)stdCtrl.getRecord();
        system.debug('AccountId' + newCase.AccountId);
    }

    public PageReference validateSaveRedirect(){

        system.debug('Sub Category:' + newCase.Sub_Category__c);
        system.debug('Serial Number:' + newCase.Serial_Number__c);

        if(newCase.Sub_Category__c == 'Cancellations' && newCase.Serial_Number__c == null){
            system.debug('Adding error message');
            ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.ERROR,'Error: Serial Number must be specified for cancellation case.');
            ApexPages.addMessage(myMsg);
            system.debug('finished Adding error message');
            return null;
        }else{
            if(null==stdCtrl.save()){
                return null;
            }
            /*try{
                stdCtrl.save();
            }
            catch(system.Exception e){
                ApexPages.Message msg = new apexPages.Message(Apexpages.Severity.ERROR, e.getdmlMessage(0));
                ApexPages.addMessage(msg);
                return null;
            }*/
            stdCtrl.save();
            system.debug('New Case Id:' + newCase.Id);
            PageReference pr = new PageReference('/' + newCase.Id);
            pr.setRedirect(true);
            return pr;
       }
    }

    public PageReference cancelRedirect(){
        stdCtrl.cancel();
        system.debug('New Case Id:' + newCase.Contact);
        PageReference pr = new PageReference('/' + newCase.Contact);
        pr.setRedirect(true);
        return pr;
    }
}

1 个答案:

答案 0 :(得分:0)

您的VF表格基于什么? <apex:inputField value="{!case.Sub_Category__c}"/>?似乎newCase变量是私有的+它没有任何getter / setter。

从我记忆中调用(Case)stdCtrl.getRecord();&#34;解耦&#34;变量。它不仅仅是对同一对象的引用而是副本。因此,stdCtrl可能已设置了您已设置的值,但它们未被传递到newCase,因为它已被克隆&#34;在用户编辑数据之前从stdCtrl开始。在您的方法中插入System.debug(stdCtrl);;如果我是对的 - 你会在那里看到你的新价值。

您可以将(Case)stdCtrl.getRecord();移动到该方法中。

或者 - 更改您的顶点以说出public Case newCase {get;set;}并修改VF表单以引用{!newCase.Sub_Category__c}等。