问题
i want to disable the validation when the button add and button delete is pressed ,so i tried this
<f:validateLength maximum="500" disabled="#{!empty param['mainForm:add_Button'] or !empty param['mainForm:delete_Button']}" />
The button add have already been disabled , however the button delete havent . And i dont know what's the problem ! This is my code , Can you guys help me to check it .Sorry for my bad english
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets" template="../main.xhtml">
<ui:define name="content">
<div id="question">
<div id="mainForm" class="form">
<span>ID:#<h:outputText value="#{editQuestion.questionData.question.id}" /></span>
<br />
<div>
<span><h:outputText value="#{i18n['admin.edit.questiontitle']}" />:</span>
<h:inputTextarea id ="title" rows="3" style="width: 100%" value="#{editQuestion.questionData.title}" required="#{!empty param['mainForm:Save_btn']}" label="Question Title">
<f:validateLength maximum="500" disabled="#{!empty param['mainForm:add_Button'] or !empty param['mainForm:delete_Button']}" />
</h:inputTextarea>
<h:message for="title" style="color: red"/>
</div>
<div>
<span><h:outputText value="#{i18n['admin.edit.questiontext']}" />:</span><br />
<h:inputTextarea rows="6" id="name" style="width: 100%" value="#{editQuestion.questionData.text}" required="#{!empty param['mainForm:Save_btn']}" label="Question Text">
<f:validateLength maximum="1000" disabled="#{!empty param['mainForm:add_Button'] }"/>
</h:inputTextarea>
<h:message for="name" style="color:red"/>
</div>
<div class="list">
<div class="title"><h:outputText value="#{i18n['admin.edit.answers']}" /></div>
<div class="btn_add">
<h:commandButton image="/resources/imgs/#{editQuestion.buttonAdd}" alt="add" id="add_Button"
title="#{i18n['img.add']}" action="#{editQuestion.addAnswer}"
disabled="#{!editQuestion.possibleToAdd}">
<f:param name="id" value="#{editQuestion.id}"/>
</h:commandButton>
</div>
<h:dataTable cellspacing="0" value="#{editQuestion.answersData}" var="answer">
<h:column>
<f:facet name="header">ID</f:facet>
<h:outputText value="#{answer.answer.id}" />
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="#{i18n['admin.edit.rightanswer']}" /></f:facet>
<h:selectBooleanCheckbox value="#{answer.answer.isRight}"/>
</h:column>
<h:column>
<f:facet name="header"><h:outputText value="#{i18n['admin.edit.answers']}" /></f:facet>
<h:inputTextarea id="answer" rows="3" cols="40" value="#{answer.text}" required="#{!empty param['mainForm:Save_btn']}" label ="Answer">
<f:validateLength maximum="500" disabled="#{!empty param['mainForm:add_Button'] }"/>
</h:inputTextarea>
<div>
<h:message for="answer" style ="color:red"/>
</div>
</h:column>
<h:column>
<h:commandButton image="/resources/imgs/#{editQuestion.buttonDelete}"
action="#{editQuestion.deleteAnswer(answer)}" disabled="#{!editQuestion.possibleToDelete}"
alt="delete" id="delete_Button" title="#{i18n['img.delete']}">
<f:param name="id" value="#{editQuestion.id}"/>
</h:commandButton>
</h:column>
</h:dataTable>
</div>
<div class="btn_block" style="float: inherit" >
<center>
<h:commandButton value="#{i18n['btn.save']}" styleClass="button bg_green" id="Save_btn" action="#{editQuestion.saveAction}">
<f:param name="id" value="#{editQuestion.id}" />
</h:commandButton>
<h:commandButton value="#{i18n['btn.cancel']}" styleClass="button bg_red" action="#{editQuestion.calcelAction}">
<f:param name="id" value="#{editQuestion.id}" />
</h:commandButton>
</center>
</div>
</div>
</div>
</ui:define>
回答1:
The <f:validateLength> is a tag handler, not an UI component. All taghandler attributes are by specification evaluated during view build time, not during view render time. So the attributes will throughout the lifetime of the same view keep the same value as it was when the view was built for the first time.
You basically need to create a custom validator which checks the request parameter inside the validate() method and then delegates to the standard LengthValidator class.
<f:validator validatorId="delegateLengthValidator" />
<f:attribute name="maximum" value="1000" />
<f:attribute name="buttonId" value="mainForm:add_Button" />
with
String buttonId = component.getAttributes().get("buttonId");
if (!context.getExternalContext().getRequestParameterMap().containsKey(buttonId)) {
LengthValidator validator = new LengthValidator();
validator.setMaximum(Integer.valueOf(component.getAttributes().get("maximum")));
validator.validate(context, component, value);
}
Note that OmniFaces has recently added a new <o:validator> tag which should solve exactly this problem as follows:
<o:validator validatorId="javax.faces.Length" maximum="1000" disabled="#{!empty param['mainForm:add_Button']}" />
See the showcase example here.
来源:https://stackoverflow.com/questions/10751260/disabled-attribute-of-fvalidatelength-does-not-evaluate-request-parameters