Есть ли способ не отправлять целую веб-форму, когда нажмите кнопку?

StackOverflow https://stackoverflow.com/questions/3560459

  •  01-10-2019
  •  | 
  •  

Вопрос

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

"A.JSF" -> Управляемый боб: боб "# {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"/>
 ...

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

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

Надеюсь, что он отправит к компоненту с ID = «TOM», поэтому затем рычание с ID = MSG, не получит нагрузки, но не повезет. Я пытаюсь перевернуть upload флаг, когда я нажимаю Back кнопка, но веб-форма запрашивается перед методом, который обрабатывает back навигация вызвана.

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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();
    }
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top