2009-12-21 7 views
4

J'ai des résultats étranges avec une page Visualforce (oui, Salesforce.com est icky, je sais). Mon problème est que j'essaie d'utiliser inputField pour lier des données sur un sObject personnalisé, mais dans mon contrôleur personnalisé, il ne reconnaît pas les données d'entrée de l'utilisateur.Problème de liaison de données inputField avec VisualForce

Voici l'extrait de code de la page:

<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> 

et voici le code du contrôleur:

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; 
} 

J'ai fait que la propriété workingFee n'est pas nul. Chaque fois que j'appuie sur le bouton «Enregistrer les frais» après avoir entré les valeurs, il recharge la page et me donne le message «Erreur: Les champs obligatoires sont manquants: [Fee__c]» (note, Fee__c ici est un champ de devise - ce n'est pas ça L'instruction de débogage dans la méthode saveFee() montre que les champs importants de workingFee sont null, alors que je suppose que les valeurs entrées par l'utilisateur leur ont été assignées.

Répondre

10

J'ai eu tout un tas de problèmes de liaison des contrôles à une propriété exposée avec le simple {get; ensemble; } Notation ... Le reste de votre code verra les propriétés, mais pour une raison bizarre, votre vue ne sera pas (toujours) se lient ...

Essayez d'écrire des méthodes get/set explicites, comme

private workingFee; 
public Fee__c getWorkingFee() { 
    return workingFee; 
} 

public void setWorkingFee(Fee__c value) { 
    workingFee = value; 
} 

il n'y a aucune raison logique pourquoi cela devrait fonctionner tout différent

public Fee__c workingFee { get; set; } 

mais dans mon expérience, il fait parfois ...

qu'avez-vous dit à ce sujet d'être dégueu? ;)

+0

Merci Ian, malheureusement, cela ne semble pas être le problème. J'ai exactement le même comportement avec les setters et les getters explicites. Je vais aussi dire que l'utilisation des propriétés fonctionne pour les autres sObjects dans la même page/contrôleur! – Ben

+0

Drat - Je suis content d'avoir dit 'parfois' ... c'est très aléatoire. OK - alors devinez ... quand instanciez-vous l'objet Fee__c? Dans le constructeur? Chuck une déclaration de débogage dans vos nouvelles méthodes get/set pour voir si l'objet Fee__c est nul ou non ... – kiwipom

+0

une autre bonne idée, mais non, ce n'est pas nul. Je l'instancie dans le constructeur. Les journaux de débogage indiquent que le getter est appelé et que l'objet Fee n'est pas nul; cependant, je ne vois nulle part l'appelant s'appeler! Qu'est-ce que j'oublie ici? – Ben

0

Immédiat = faux/vrai m'a mordu plusieurs fois aussi. Bonne capture Ian.

Questions connexes