Как проверить элемент управления загрузкой файлов в пользовательском валидаторе

1

Я создал пользовательский валидатор в Java, который я использую в своем XPage. Все данные привязаны к управляемому компоненту (включая "дочерние" наборы данных - строки - основного объекта данных). В моем методе проверки я проверяю компонент строки (и нахожу некоторых своих "братьев и сестер", чтобы проверить, что если один заполняется, другой должен быть заполнен или его значение в течение определенного интервала). Это отлично подходит для обычных полей (выбор, ввод и флажки).

Но как я могу получить контроль над загрузкой файлов? Картинка должна быть прикреплена, если установлен флажок в той же строке. Это определение my fileUpload:

<xp:fileUpload id="fileUploadSingle" value="#{row.photo}"
    disableClientSideValidation="true" required="true">
    <xp:this.validators>
        <xp:validator validatorId="fishingTripValidator"></xp:validator>
        <xp:validateRequired message="You must attach a photo"></xp:validateRequired>
    </xp:this.validators>
</xp:fileUpload>

Я думаю, что есть две проблемы:

  1. Как вызвать "требуемый" сервер. Я проверил это, просто установив нужное поле. Работает нормально на стороне клиента - но не вызывает серверную сторону... Однако мой метод проверки вызывается, если значение заполнено (то есть выбрано файл), и я могу прочитать значение в com.ibm.xsp.http.UploadedFile и получить, например, имя файла клиента (getClientFileName()).

  2. Захватите элемент управления загрузкой файлов, когда обнаружите, что флажок установлен - и проверьте, имеет ли файл управления загрузкой какой-либо файл, указанный в нем...

Я могу найти правильный элемент управления как UIComponent и захватить объект com.ibm.xsp.component.UIFileuploadEx.UploadedFile. См. Этот фрагмент:

com.ibm.xsp.component.xp.XspFileUpload fileUpload = (com.ibm.xsp.component.xp.XspFileUpload) component;
if (null != fileUpload) {
    com.ibm.xsp.component.UIFileuploadEx.UploadedFile uploadedFile = (com.ibm.xsp.component.UIFileuploadEx.UploadedFile) fileUpload.getValue();
    if (null != uploadedFile) {
        return uploadedFile.getFilename();
    }
}
return null;

Странно то, что когда я устанавливаю флажок И присоединяю файл - вышеуказанный код НЕ найдет файл - и валидатор вернет ошибку. Имя файла, указанное в элементе управления загрузкой файлов, теперь исчезло. Однако, если я сохраню снова, не изменяя ничего, тогда управление файлом в фрагменте кода правильно найдет файл - поэтому не возникает ошибка проверки и файл правильно загружен...

Если бы я мог инициировать валидацию на "обязательном", я думаю, что мог бы избежать других "хаков", где, очевидно, что-то происходит "между" двумя "сбережениями".

Любые идеи, как я могу правильно это контролировать?

/John

Теги:
validation
xpages

1 ответ

0

Обходным путем является добавление скрытого поля ввода в каждую строку. Это свойство, требуемое для этого поля, зависит от флажка и управления загрузкой файлов:

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.data>
        <xp:dominoDocument var="document1" formName="RTItem" action="editDocument" concurrencyMode="force" />
    </xp:this.data>

    <xp:repeat id="repeatFiles" rows="30" var="row" value="#{javascript:['A','B','C','D','E','F'];}">
        <xp:checkBox text="File?" id="checkBoxFile" checkedValue="1" uncheckedValue="0" />
        <xp:fileUpload  id="fileUpload" value="#{document1[row]}" />
        <xp:inputHidden id="inputHiddenFileHelper">
            <xp:this.required>
                <![CDATA[#{javascript:
                    var cmpCheck = getComponent( "checkBoxFile" );
                    var cmpFile = getComponent( "fileUpload" );

                    if( cmpCheck.value == "0" )
                        return false;

                    if( cmpFile.getValue() == null )
                        return true;
                }]]>
            </xp:this.required>
        </xp:inputHidden>
        <xp:br />
    </xp:repeat>

    <xp:messages id="messages1" />

    <!-- a button to refresh the page -->
    <xp:button value="Submit" id="buttonRefreshMe">
            <xp:eventHandler event="onclick" submit="true" immediate="false" save="true"/>
    </xp:button>

</xp:view>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню