inputField problema associazione dati con Visualforce
-
20-09-2019 - |
Domanda
Sto avendo strani risultati con una pagina Visualforce (sì, Salesforce.com è icky, lo so). Il mio problema è che io sto cercando di utilizzare l'inputField per associare i dati su un sObject personalizzato, ma nel mio controller personalizzato, esso non riconosce i dati di input dell'utente.
Ecco il frammento di codice dalla pagina:
<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 qui è il codice dal controller:
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;
}
Ho fatto in modo che la proprietà workingFee non è nullo. Ogni volta che mi ha colpito il pulsante "Save Fee" dopo aver inserito i valori, si ricarica la pagina e mi dà il "Errore: I campi obbligatori sono mancanti: [Fee__c]" messaggio (nota, Fee__c ecco un campo di valuta - non è che si aspetta che questo sia un sObject, è vero?)
La dichiarazione di debug nel metodo saveFee () mostra che i campi importanti della workingFee sono nulli, quando mi aspetterei loro di sono stati assegnati dai valori introdotti dall'utente.
Soluzione
Ho avuto un mucchio di problemi di controlli vincolanti a una proprietà esposta con il semplice {get; impostato; } Notazione ... Il resto del codice vedrà le proprietà, ma per qualche strana ragione, la vostra vista non (sempre) si legano ...
Provare a scrivere espliciti metodi get / set, come
private workingFee;
public Fee__c getWorkingFee() {
return workingFee;
}
public void setWorkingFee(Fee__c value) {
workingFee = value;
}
Non v'è alcuna ragione logica per cui questo dovrebbe funzionare qualsiasi diverso da
public Fee__c workingFee { get; set; }
ma nella mia esperienza, a volte fa ...
che cosa hai detto sul fatto che sia icky? ;)
Altri suggerimenti
Immediate = false / true ha morso me un bel paio di volte troppo. Buona cattura Ian.