2009-12-23 3 views
1

У меня есть форма обновления, с составными ключами Все составные клавиши отображаются в поле ввода, поскольку у меня есть скрытое поле для каждого составного ключа. Эти значения выходных данных пусты после ошибки проверки. Как это решить. Я на той же странице, поэтому он не должен иметь значения.Ошибка проверки JSF, потерянное значение

ответ

2

Это действительно неинтуитивное поведение h:inputHidden (я когда-либо подавал issue против него в списке выпусков Mojarra, но они ничего не делали с ним). Вся проблема состоит в том, что значение компонента необязательно равно также, принятое во весь цикл проверки, в то время как нет средств ввода, управляемого пользователем. Он потеряется, когда проверка не удалась. Есть как минимум три способа исправить это неинтуитивное поведение.

Первый способ заключается в использовании binding на h:inputHidden вместо:

<h:inputHidden binding="#{bean.hidden}" /> 

Таким образом, значение не претерпит ненужный цикл проверки. Однако это требует изменений в способе получения/установки значений в коде компонента резервного копирования. Например:

private HtmlInputHidden hidden = new HtmlInputHidden(); // +getter +setter. 

public void setHiddenValue(Object hiddenValue) { 
    hidden.setValue(hiddenValue); 
} 

public Object getHiddenValue() { 
    return hidden.getValue(); 
} 

Второй (и имхо предпочтительный способ) заключается в использовании Tomahawk «ы t:saveState вместо этого.

<t:saveState value="#{bean.property}" /> 

Главное преимущество заключается в том, что вам не нужно ничего менять в коде бэкэнда. Он восстановит значение раньше, чем будет применяться фаза запроса заявки. Вам нужно только добавить дополнительные библиотеки, если это еще не сделано, но поскольку Tomahawk предоставляет гораздо больше преимуществ, чем только t:saveState, например, в основной реализации JSF отсутствуют компоненты/функции t:inputFileUpload, t:dataList, t:dataTable preserveDataModel="true", t:selectOneRadio layout="spread" и т. Д., Это стоит того усилия.

Третий способ заключается в том, чтобы сохранить его в компоненте, включенном в сеанс, но на самом деле вы не хотите делать это для переменных области запроса. Это даст только "wtf?" когда конечный пользователь имеет несколько вкладок/окон, открытых в одном сеансе.

Смежные вопросы