【问题标题】:Cannot validate on saving new record无法验证保存新记录
【发布时间】:2017-08-29 05:37:11
【问题描述】:

Salesforce 大师:

我正在编写一个 Salesforce visualforce 页面扩展控制器来实现验证和其他业务逻辑。但是,我的代码没有按预期工作。似乎从未达到验证子类别和序列号的代码。尽管我在 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;
    }
}

【问题讨论】:

    标签: salesforce visualforce apex salesforce-communities


    【解决方案1】:

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

    据我所知,调用(Case)stdCtrl.getRecord(); 的行为将变量“解耦”。它更像是一个副本而不是对同一对象的引用。因此,stdCtrl 很可能具有您设置的值,但它们没有传递给newCase,因为它是在用户编辑数据之前从stdCtrl“克隆”出来的。在您的方法中插入System.debug(stdCtrl);;如果我是对的 - 你会在那里看到你的新价值观。

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

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

    【讨论】:

    • 谢谢,Eyescream,我发现在新记录提交到数据库之前,该 ID 不可用于检查。感谢您回答我的问题。
    猜你喜欢
    • 2018-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 2018-03-02
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多