JSF selectOneMenu значение не установлено - PullRequest
0 голосов
/ 03 ноября 2011

У меня есть страница, где отображается SelectOneMenu, есть ли какая-либо информация о БД или нет. Моя форма выглядит так:

...
<h:form id="wrapperUpload" enctype="multipart/form-data" >
<h:outputLabel for="option" value="Tipo de carga: "
                            rendered="#{uploadFile.check(userVerifier.dependencia)}" />
<h:selectOneMenu id="option"
                 value="#{uploadFile.optionSelected}"
                 rendered="#{uploadFile.check(userVerifier.dependencia)}"  >
    <f:selectItems value="#{uploadFile.options}" />
</h:selectOneMenu>
<h:outputLabel for="upfile" value="Archivo: " />
<t:inputFileUpload id="upfile" required="true" 
                   value="#{uploadFile.upFile}" />
<h:commandButton value="Validar #{userVerifier.dependencia}"
                 action="#{uploadFile.upload}"
                 onclick="return confirmation()" >
    <f:param name="dependencia" value="#{userVerifier.dependencia}" />
</h:commandButton>
</h:form>
...

И моя фасоль

private UploadedFile upFile;
private boolean showOptions = false;
private final String[] options = {
    "Seleccione una opción.",
    "Cargar toda la información.",
    "Cargar solo información errónea."
};
private String optionSelected;
private Database db = new Database();

public UploadedFile getUpFile() {
    return upFile;
}

public void setUpFile(UploadedFile upFile) {
    this.upFile = upFile;
}

public String[] getOptions() {
    return options;
}

public void setOptionSelected(String optionSelected) {
    this.optionSelected = optionSelected;
}

public String getOptionSelected() {
    return optionSelected;
}

public boolean check(String dependencia) {
    String hasInfo;
    hasInfo = db.checkForInfo(dependencia);
    if (hasInfo.equals("T")) {
        showOptions = true;
    } else {
        showOptions = false;
    }
    return showOptions;
}

public String upload() {
    byte[] buffer = null;
    int count = 0;
    File serverFile = null;
    InputStream input = null;
    OutputStream output = null;

    Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    String dependencia = params.get("dependencia");
    String extension = FilenameUtils.getExtension(upFile.getName());

    System.out.println("__depend:   " + dependencia);
    System.out.println("__option:   " + optionSelected);  //null
...
...

Наконец, когда я нажимаю кнопку, значение SelectOneMenu (или selectedOption в моем бине) всегда равно нулю ... Как это исправить? Я что-то упустил?

Забыл упомянуть, что, если я удаляю часть рендера, все работает нормально ...

1 Ответ

0 голосов
/ 03 ноября 2011

Забыл упомянуть, что, если я удаляю часть рендеринга, все работает нормально

Это может означать только то, что бин находится в области запроса и что rendered Атрибут зависит от переменной, основанной на запросе, которая присутствовала в начальном запросе при отображении формы, но отсутствует в последующем запросе при обработке отправки формы.

Помещение компонента в область просмотра или обеспечение того, чтобы запрос основывалсяпеременная сохраняется в последующем запросе, это должно исправить вашу проблему.

Поскольку вы не опубликовали реальный код, невозможно опубликовать код того, как исправить это правильно.

См. также:


Обновление : каксогласно вашему обновлению и комментариям вы должны сделать UserVerifier управляемым свойством bean-компонента UploadFile и выполнить предварительную инициализацию в (post) конструкторе.Что-то вроде:

@ManagedBean
@ViewScoped
public class UploadFile {

    @ManagedProperty("#{userVerifier}")
    private UserVerifier userVerifier; // +setter

    private boolean showOptions;

    @PostConstruct
    public void init() {
        showOptions = "T".equals(db.checkForInfo(userVerifier.getDependencia()));
    }

    public boolean isShowOptions() {
        return showOptions;
    }

    // ...
}

с

rendered="#{uploadFile.showOptions}"

и избавлением от <f:param>.

...