Вопрос

У меня странные результаты на странице Visualforce (да, Salesforce.com — это неприятно, я знаю).Моя проблема заключается в том, что я пытаюсь использовать inputField для привязки данных к пользовательскому sObject, но в моем пользовательском контроллере он не распознает входные данные пользователя.

Вот фрагмент кода со страницы:

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

и вот код с контроллера:

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

Я убедился, что свойствоworkFee не равно нулю.Всякий раз, когда я нажимаю кнопку «Сохранить комиссию» после ввода значений, страница перезагружается и выдается сообщение «Ошибка:Отсутствуют обязательные поля:[Fee__c]" (обратите внимание: здесь Fee__c — это поле валюты, ведь оно не ожидает, что это будет sObject, не так ли?)

Оператор отладки в методе saveFee() показывает, что важные поля WorkFee имеют значение NULL, тогда как я ожидал, что им были присвоены значения, введенные пользователем.

Это было полезно?

Решение

У меня была целая куча проблем с привязкой элементов управления к свойству, предоставляемому с помощью простого { get;набор;} обозначение...Остальная часть вашего кода увидит свойства, но по какой-то странной причине ваше представление не будет (всегда) связываться...

Попробуйте написать явные методы получения/установки, например

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

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

Нет никакой логической причины, почему это должно работать иначе, чем

public Fee__c workingFee { get; set; }

но по моему опыту иногда так бывает...

что ты сказал о том, что это отвратительно?;)

Другие советы

Immediate=false/true меня тоже несколько раз кусал.Хороший улов, Ян.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top