有没有办法在单击按钮时不发送整个Web表单?

Tha*_*ham 6 java jsf primefaces

我会尽量简短,请在这里和我在一起

"A.jsf" - >托管bean: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>
Run Code Online (Sandbox Code Playgroud)

那么 handleFileUpload()

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

"B.jsf" - >托管bean:bean2

 ...
 <p:growl id="msgs" showDetail="true"/>
 ...
Run Code Online (Sandbox Code Playgroud)

当我点击上传时,它会给我一个咆哮错误消息"你没有上传权限.",这很好.但是当我点击"返回",这将把我带到B.jsf时,我看到了咆哮的消息"你没有权限上传." 再次.似乎正在发生的是当我点击"返回"时,我发送其他表单请求上传,然后生成相同的错误消息,然后显示在B.jsf.有没有办法解决这个问题,除了将"后退"按钮放入一个空的表格,因为现在我有两个按钮站在彼此的顶部,而不是并排.我试着这样做:

FacesContext.getCurrentInstance().addMessage("tom", msg);
Run Code Online (Sandbox Code Playgroud)

希望它会发送到id ="tom"的组件,那么id = msgs的growl将不会加载,但没有运气.upload当我单击Back按钮时,我尝试打开标志,但在处理back导航的方法被调用之前,请求Web表单.

它并不像我希望的那样简短,因此我要为它道歉:D

Bal*_*usC 5

将"后退"按钮放在一个空的表格旁边,因为现在我有两个按钮站在彼此的顶部

HTML <form>默认为块元素.默认情况下,HTML块元素放在一个新行中.你真的想让它成为一个内联元素.你可以display: inline;在CSS中使用它.

回到实际的问题,然而令我惊讶的fileUploadListener是,该方法尽管immediate="true"在其中被调用p:commandButton.我试图重现这一点,我可以证实这一点.但我不指望它会发生.通常,immediate="true"按钮跳过提交"整体"表单的解决方案(至少跳过UIInput没有此属性的组件).进一步的调查了解到,p:fileUpload根本不是UIInput组件,并且在应用请求值阶段而不是验证或更新模型值阶段期间触发器被触发.所以这种行为是完全可以预测的,但仍然是设计中的疏忽.

由于组件上的p:fileUpload要求,另一方面,您也可以将其从后退按钮中移除,以便它触发一个异常请求,从而跳过被调用的内容.ajax="false"p:commandButtonfileUploadListener