我有一个JSF2表单,其中一些字段定义为只读,虽然用户无法访问必须提交。 我面临的问题是,当我提交表单时,只读字段的值为null。 我读了一些帖子Data in <h:inputText readonly="true"> disappears when command button is clicked,但有一些建议,但要么我不明白它们是如何工作的,要么我的表格有问题。
以下是我的表格:
<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字段的标签readonly设置为
<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;
}
答案 0 :(得分:0)
尝试按照以下方式禁用组件:
<h:inputText id="fldA3" value="#{cc.attrs.mybean.fldA3}" disabled="#{facesContext.renderResponse}" size="14"/>
答案 1 :(得分:0)
我多次遇到这个问题,JSF没有提交禁用或只读输入字段,如果您需要对已经开发的界面进行快速且看似简单的更改,这可能会很麻烦。此只读字段也未经过验证。将隐藏的输入字段并行添加到现有字段中还有其他问题会使其使用起来不方便,所以我决定将输入保留在正常的默认条件下,但是使用具有更高z-index的附加元素覆盖它们,以便该字段处于活动状态并由通常是JSF,但对于用户来说它显示为只读字段。 只需在&#34;位置:绝对&#34;在输入的基础上,它将表现为只读或禁用,具体取决于应用的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);
}