Как поставить проверку на p: fileUpload - PullRequest
2 голосов
/ 08 марта 2012

Наряду с парами inputText, одним из обязательных компонентов, которые у меня есть на странице, является p: fileUpload. Поэтому, когда я нажимаю "Отправить", <p:message> появляется на компоненте, который имеет require=true, но пользователь не набрал / не выбрал

enter image description here

Я хочу, чтобы красное поле Required также появилось рядом с компонентом загрузки. Вот что я попробовал.

1. когда я устанавливаю required="true" в p: fileUpload, на самом деле ничего не происходит (не уверен, что это ошибка).
2 Я положил validator в p:fileUpload, ниже мои источники валидатора

public void validateFileUpload(FacesContext context, UIComponent component,
       Object value) throws ValidatorException {
   if(value == null){
     FacesMessage message = new FacesMessage();
     message.setSeverity(FacesMessage.SEVERITY_ERROR);
     message.setSummary("Error");
     message.setDetail("Required");
     throw new ValidatorException(message);      
   }
}

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

3. Когда я нажимаю кнопку «Отправить», если все остальное проходит, и я попадаю в свой метод действия, я могу проверить, является ли файл нулевым или нет, затем вернуть FacesMessage и позволить p: growl его забрать. Однако мне это не нравится, так как это дает пользователю ощущение многоуровневой проверки.

Есть ли способ улучшить проверку p: fileUpload ?

1 Ответ

2 голосов
/ 18 октября 2012

Для тех, у кого такая же проблема, я столкнулся с этой проблемой при создании мастера.Обходной путь, который я использовал, - хранить загруженный файл в поле моего bean-объекта видимости и проверять это поле при попытке перейти к следующему шагу.

Тег мастера:

<p:wizard id="importBankAccountLogWizard"
            widgetVar="importBankAccountLogWizard"
            flowListener="#{bankAccountLogImportBean.onFlowProcess}">

Загрузка файлатег (у меня есть рендеринг и атрибут обновления, настроенный так, что сообщение будет отображаться, а загруженный будет скрыт после первой загрузки):

<p:fileUpload id="bankAccountLogFileInput"
                                      fileUploadListener="#{bankAccountLogImportBean.setBankAccountLogFile}"  
                                      rendered="#{bankAccountLogImportBean.renderFileUploadInput}"
                                      mode="advanced"  
                                      update="importBankAccountLogWizard"  
                                      auto="true"
                                      sizeLimit="1000000" />

Bean:

public void setBankAccountLogFile(FileUploadEvent event)
{
    importFile = event.getFile();
    FacesMessage msg = new FacesMessage(Localization.g("FILE_HAS_BEEN_UPLOADED", event.getFile().getFileName()));
    FacesContext.getCurrentInstance().addMessage(null, msg);
}

public String onFlowProcess(FlowEvent event)
{
    if("bankAccountLogImportInputTab".equals(event.getOldStep()) &&
       importFile == null)
    {
        FacesMessage msg = new FacesMessage(Localization.g("UPLOAD_A_FILE_TO_CONTINUE"));
        FacesContext.getCurrentInstance().addMessage(null, msg);
        return event.getOldStep();
    }

    return event.getNewStep();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...