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;
}
}
答案 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}
等。