Проблема привязки данных inputField с VisualForce
-
20-09-2019 - |
Вопрос
У меня странные результаты на странице 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 меня тоже несколько раз кусал.Хороший улов, Ян.