2010-08-24 51 views
6

我会尽量尽量简短,请留在我这里有没有办法在点击按钮时不发送整个Web表单?

“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” - >管理的bean:bean2

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

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

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

希望它会发送到与ID =“汤姆”组件,所以后来的咆哮与ID =封邮件,不会得到负荷,但没有运气。当我单击Back按钮时,我尝试打开upload标志,但在处理back导航的方法被调用之前,Web表单被请求。

它不是简短,因为我想它是,所以我想为此道歉:

回答

5

把“返回”按钮到一个空的身旁,因为现在我有两个按钮,站在对方的顶部

的HTML <form>缺省为block element。 HTML块元素默认放置在一个新行中。你真的想把它做成inline element。你可以在CSS中使用display: inline;

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

由于p:fileUpload要求p:commandButton组件上ajax="false",可以在另一方面也只是从背面按钮,以便触发一个ajaxical请求并特此跳过fileUploadListener被调用将其删除。

+0

在'Back'按钮的'p:commandButton'上取出'ajax =“false”'确实不会阻止'fileUploadListener'被调用,但是也阻止了'导航流程'。因此,'Back'按钮不会带我到哪里,但是'display:inline'很好用,非常感谢您花费时间在它上面,BalusC – 2010-08-25 14:07:59

+0

不客气。 – BalusC 2010-08-25 14:10:11

2

其实d,把按钮以不同的形式听起来像一个很好的解决方案。按钮不再对齐的原因是新的起始<form>元素从其自己的行开始。您应该可以通过将form { display: inline; }添加到您的CSS文件来防止此问题。这就是说,如果你有一些你想摆脱的遗留的错误信息,你可以在你的支持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(); 
    } 
} 

这里的缺点是,提交表单和初始化目标页面的支持bean之间出现的任何错误也被吞噬。

+0

谢谢。我尝试这个'提交按钮返回按钮',我仍然有两个站在彼此的顶部。方法'clearErrorMessages()',你说把它放到目标托管bean的初始化方法中,以及我的目标托管bean有'SessionScoped',所以构造函数只会在应用程序第一次加载时被调用,除非有一些一种注释来检测页面何时重新加载。 – 2010-08-24 21:52:33

相关问题