Есть ли способ не отправлять целую веб-форму, когда нажмите кнопку?
-
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();
}
}
Недостатком здесь является то, что любые ошибки, которые возникают между отправкой формы и инициализация бона для заднего бона целевой страницы, также проглатываются.