1

我有一个 JSF2 表单,其中一些字段定义为只读,尽管用户无法访问,但必须提交。我面临的问题是,当我提交表单时,只读字段评估为空。我阅读了 <h:inputText readonly="true"> 中的线程数据在单击命令按钮时消失了一些建议,但要么我不明白它们是如何工作的,要么我的表单有问题。

这是我的表格中的内容:

<h:inputTextarea  id="attLFld" value="#{cc.attrs.inc.attL}" rows="8" cols="40" 
         onblur="lookupL(this.value)" >
    <rich:validator/>
</h:inputTextarea>

<h:inputText  id="attLIFld" value="#{cc.attrs.inc.attLI}"   size="14"  readonly="true" />

<a4j:jsFunction name="lookupL" execute="attLFld"
        render="attLFld,attLIFld" 
        action="#{incController.lookupL}">        
</a4j:jsFunction>

这是我的控制器方法

public void lookupL()
{
   newInc.setAttLI("1234");
}

我尝试按照上面线程中的建议将带有只读标签的 inputText 字段设置为

<h:inputText  id="attLIFld" value="#{cc.attrs.inc.attLI}"   size="14"  readonly="#{facesContext.renderResponse}" />

但这对我不起作用。


不幸的是,这个建议对我不起作用。我认为我的表格有问题,但我看不出是什么。任何帮助都会非常受欢迎。

这是 xhtml 提取(我使用 Richfaces 4,顺便说一句)

<composite:implementation>
<h:panelGrid columns="3"   border="0">
<h:panelGrid columns="1" border="0">   
    <rich:panel id="rpA"> 
        <f:facet name="header">
            <h:outputText value="Field Group A"/>
        </f:facet>  
        <h:panelGrid columns="2" columnClasses="titleCell"   border="0">    
            <h:outputLabel for="fldA1" value="Field A1:" />
            <h:inputTextarea  id="fldA1" value="#{cc.attrs.mybean.fldA1}" rows="8" cols="40" immedite="true" onblur="lookup(this.value)" >
                <rich:validator/>
            </h:inputTextarea>              

            <h:outputLabel for="fldA2" value="Field A2:" />
            <h:inputText  id="fldA2" value="#{cc.attrs.mybean.fldA2}"   size="14"  readonly="true" />                       

            <h:outputLabel for="fldA3" value="Field A3:"/>
            <h:inputText  id="fldA3" value="#{cc.attrs.mybean.fldA3}"  readonly="#{facesContext.renderResponse}" size="14"/>            

        </h:panelGrid>           
    </rich:panel>    
</h:panelGrid>
<h:panelGrid id="pgButtons" columns="1" border="0">
    <a4j:commandButton type="button"  value=">>>>"  action="#{myBeanController.copyFields}"  immediate="true"
    execute="fldA1,fldA2,fldA2H,fldA3,fldA3H" 
    render="fldB1,fldB2,fldB3"/> 

 </h:panelGrid>

<rich:panel id="rpB"> 
        <f:facet name="header">
            <h:outputText value="Field Group B"/>
        </f:facet>  
        <h:panelGrid columns="2" columnClasses="titleCell"   border="0">    
            <h:outputLabel for="fldB1" value="Field B1:" />
            <h:inputTextarea  id="fldB1" value="#{cc.attrs.mybean.fldB1}" rows="8" cols="40" immediateue="true"  >
                <rich:validator/>
            </h:inputTextarea>              

            <h:outputLabel for="fldB2" value="Field B2:" />
            <h:inputText  id="fldB2" value="#{cc.attrs.mybean.fldB2}"   size="14"  readonly="true" />      


            <h:outputLabel for="fldB3" value="Field B3:"/>
            <h:inputText  id="fldB3" value="#{cc.attrs.mybean.fldB3}"  readonly="#{facesContext.renderResponse}" size="14"/>


        </h:panelGrid>           
    </rich:panel>    
</h:panelGrid>      

<div id="hiddenFields">

     <h:inputHidden value="#{cc.attrs.mybean.fldA2H}" id="fldA2H" />
     <h:inputHidden value="#{cc.attrs.mybean.fldA3H}" id="fldA3H"/>  
</div>

<a4j:jsFunction name="lookup" execute="fldA1"
    render="fldA1,fldA2,fldA3,,fldA2H,fldA3H" 
    action="#{myBeanController.lookup}">
  <a4j:param name="loc" assignTo="#{cc.attrs.mybean.fldA1}" />
</a4j:jsFunction>

</composite:implementation>

我在这里要做的是在字段 A1 中输入一些内容,然后填充 A2 和 A3 字段,然后单击按钮将所有这些 Ax 字段复制到 Bx 字段中。我可以做第一部分,但是当我单击按钮时,在控制器方法 copyFields 中,可见(但只读)和隐藏字段都评估为 null

@Model
public class MyBeanController {
  private MyBean newMBean;
   private MyBean mBean;

   @Produces
   @Named
   public MyBean getNewMBean()  {
      return newMBean;
   }

    @Produces
    @Named
    public MyBean getMBean() {
        return mBean;
    }

    public void setNewMBean(MyBean mBean) {
        this.mBean = mBean;
    }

    @PostConstruct
    public void initNewMBean() {
        newMBean = new MyBean();        
    }

    public void lookup()    {
        newMBean.setFldA2("boo");
        newMBean.setFldA2H("boo");
        newMBean.setFldA3("hoo");
        newMBean.setFldA3H("hoo");
    }

    public String copyFields()  {
        newMBean.setFldB1(newMBean.getFldA1());
        newMBean.setFldB2(newMBean.getFldA2H());
        newMBean.setFldB3(newMBean.getFldA3H());
        return null;

    }
4

2 回答 2

0

尝试像这样禁用组件:

<h:inputText  id="fldA3" value="#{cc.attrs.mybean.fldA3}"  disabled="#{facesContext.renderResponse}" size="14"/>
于 2014-08-29T08:19:45.027 回答
0

我多次遇到这个问题,JSF 不会提交禁用或只读输入字段,如果您需要对已开发的界面进行快速且看似简单的更改,这可能会很痛苦。此只读字段也未经过验证。将隐藏的输入字段与现有字段并行添加还有其他问题,使其使用不便,因此我决定将输入保留在正常的默认条件下,但用具有更高 z-index 的附加元素覆盖它们,以便该字段处于活动状态并由JSF 通常,但对于用户它显示为只读字段。只需在输入顶部放置一个带有“位置:绝对”的 div,它的行为就像只读或禁用,具体取决于应用的 CSS。

此类 div 的 css 示例:

div.input-blocker {
position: absolute;
left: 0;
top: 0;
z-index: 10004;
width: 100%;
height: 80px;
background-color: rgba(0,0,0,0.05);

}

于 2015-09-22T06:51:27.917 回答