Есть ли способ не отправлять целую веб-форму при нажатии кнопки? - PullRequest
6 голосов
/ 24 августа 2010

Я постараюсь быть максимально кратким, пожалуйста, оставайтесь со мной здесь

"A.jsf" -> Управляемый компонент: bean "# {bean.list}": доставит нас к B.jsf

        <p:growl id="msgs" showDetail="true"/>
        <h:form id="myform1" enctype="multipart/form-data">
            <p:panel header="Upload" style="font-size: 11px;">
                <h:panelGrid columns="2" cellpadding="10">
                    <h:outputLabel value="Drawing:" />
                    <p:fileUpload fileUploadListener="#{bean.handleFileUpload}" update="msgs" allowTypes="*.*;"/>                        
                </h:panelGrid>
                <p:commandButton ajax="false" immediate="true" id="back" value="Back" action="#{bean.list}"/>
                <p:commandButton ajax="false" id="persist" value="Persist" action="#{bean.handleRevision}" />
            </p:panel>
        </h:form>

Затем handleFileUpload()

        if(!upload){
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "You do not have permission to upload.");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        ...

"B.jsf" -> управляемый компонент: bean2

 ...
 <p:growl id="msgs" showDetail="true"/>
 ...

Когда я нажимаю кнопку загрузки,Дайте мне рычание с сообщением об ошибке «У вас нет прав на загрузку.», и это хорошо.Но затем, когда я нажимаю «Назад», который приведет меня к B.jsf, я вижу рычание «У вас нет разрешения на загрузку».снова.Кажется, что происходит, когда я нажимаю кнопку «Назад», я отправляю другой запрос формы для загрузки, который затем генерирует то же сообщение об ошибке, которое затем отображается в B.jsf.Есть ли способ исправить это, кроме помещения кнопки «Назад» в пустую форму, потому что теперь у меня есть две кнопки, стоящие друг над другом, а не рядом.Я пытаюсь сделать это:

FacesContext.getCurrentInstance().addMessage("tom", msg);

в надежде, что он отправит компоненту с id = "tom", поэтому рычание с id = msgs не получит загрузку, но не повезло.Я пытаюсь включить флаг upload, когда нажимаю кнопку Back, но веб-форму запрашивают до вызова метода, который обрабатывает навигацию back.

Это не так кратко, как я хочу, поэтому я хочу извиниться за это: D

Ответы [ 2 ]

5 голосов
/ 25 августа 2010

помимо помещения кнопки «Назад» в пустую форму, потому что теперь у меня две кнопки стоят друг над другом

HTML <form> по умолчанию является блочный элемент .Элементы блока HTML по умолчанию помещены в новую строку.Вы действительно хотите сделать его встроенным элементом .Вы можете сделать это, используя display: inline; в CSS.

Возвращаясь к актуальной проблеме, однако, меня удивляет, что метод fileUploadListener вызывается несмотря на immediate="true" в p:commandButton.Я попытался воспроизвести это, и я могу подтвердить это.Но я не ожидал, что это произойдет. Обычно immediate="true" на кнопке - это решение для пропуска отправки "всей" формы (по крайней мере, пропустите компоненты UIInput без этого атрибута).Дальнейшие исследования показали, что p:fileUpload вообще не является компонентом UIInput и что слушатель запускается на этапе применения значений запроса вместо этапов проверки или обновления значений модели.Таким образом, это поведение полностью предсказуемо, но, тем не менее, imo по-прежнему остается упущением в дизайне.

Поскольку p:fileUpload требует ajax="false" для компонента p:commandButton, с другой стороны, вы также можете просто удалить его изКнопка «Назад», которая запускает аяксический запрос и пропускает вызываемый fileUploadListener.

2 голосов
/ 25 августа 2010

На самом деле, перевод кнопки в другую форму звучит как отличное решение.Причина, по которой кнопки больше не совпадают, заключается в том, что новый начальный элемент <form> начинается с отдельной строки.Вы должны быть в состоянии предотвратить это, добавив form { display: inline; } в свой файл CSS.

Тем не менее, если у вас есть оставшиеся сообщения об ошибках, от которых вы хотите избавиться, вы можете сделать это в методе инициализацииваш боб (если таковой имеется).Следующее работает замечательно:

public void clearErrorMessages() {
    //it may get messy to debug why messages are swallowed
    logger.debug("clearing messages, coming from " + new Exception().getStackTrace()[1]);

    Iterator iter = FacesContext.getCurrentInstance().getMessages();
    while (iter.hasNext()) {
        FacesMessage msg = (FacesMessage) iter.next();
        logger.debug("clearing message: " + msg.getDetail());
        iter.remove();
    }
}

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

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