Problema de banco de dados Inputfield com Visualforce
-
20-09-2019 - |
Pergunta
Estou tendo resultados estranhos com uma página do Visualforce (sim, o Salesforce.com é nojento, eu sei). Meu problema é que estou tentando usar o InputField para vincular dados em um Sobject personalizado, mas no meu controlador personalizado, ele não está reconhecendo os dados de entrada do usuário.
Aqui está o trecho de código da página:
<apex:pageBlockSection title="Enter New Fee" rendered="{!isRenderedFees}" >
<apex:inputField value="{!workingFee.Fee_Type__c}" required="True"/>
<apex:inputField value="{!workingFee.Fee__c}" required="True"/>
<apex:pageBlockSectionItem >
<apex:CommandButton value="Save Fee" action="{!saveFee}" immediate="true" />
<apex:CommandButton value="Cancel" action="{!cancelFee}" immediate="true" />
</apex:pageBlockSectionItem>
</apex:pageBlockSection>
E aqui está o código do controlador:
public Fee__c workingFee {get; set;}
....
public PageReference saveFee(){
this.workingFee.Trade_Group__c = tradeGroup.id;
try{
System.debug('~~~~#~~#~~workingFee: '+workingFee.Fee_Type__c +'='+workingFee.Fee__c);
upsert workingFee;
}catch (System.Dmlexception e){
ApexPages.addMessages(e);
return null;
}
System.debug('~~~~#~~#~~workingFee: '+workingFee.Fee_Type__c +'='+workingFee.Fee__c);
//savedFees.add(workingFee.clone());
//re-render the page
this.isRenderedFees = False;
return null;
}
Eu certifiquei -me de que a propriedade Workingfee não fosse nula. Sempre que eu pressiono o botão "Salvar taxa" depois de inserir os valores, ele recarrega a página e me dá a mensagem "Erro: os campos obrigatórios estão faltando: [Fee__c] (Nota, Fee__c Aqui está um campo de moeda - não é que não seja espera que isso seja um objeto, não é?)
A instrução Debug no método SaveFee () mostra que os campos importantes do Workingfee são nulos, quando eu esperaria que eles tenham recebido a entrada dos valores pelo usuário.
Solução
Eu tive um monte de problemas que vincula controles a uma propriedade exposta com o simples {get; definir; } notação ... o restante do seu código verá as propriedades, mas por algum motivo bizarro, sua visão não será (sempre) se vincular ...
Tente escrever métodos explícitos de obter/definir, como
private workingFee;
public Fee__c getWorkingFee() {
return workingFee;
}
public void setWorkingFee(Fee__c value) {
workingFee = value;
}
Não há razão lógica para que isso funcione diferente para
public Fee__c workingFee { get; set; }
Mas na minha experiência, às vezes faz ...
O que você disse sobre ser nojento? ;)
Outras dicas
Imediato = false/true também me mordeu algumas vezes. Boa pegar Ian.