A disabled attribute <f: validateLength> does not evaluate query parameters

I want to disable validation when the add button and delete button are pressed, so I tried this

<f:validateLength maximum="500" disabled="#{!empty param['mainForm:add_Button'] or !empty param['mainForm:delete_Button']}" />

The add button is already disabled, but the delete havent button. And I don’t know what the problem is! This is my code. Can you guys help me check it out. 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>

+3
source share
1 answer

<f:validateLength>- a tag handler, not a user interface component. All taghandler attributes are defined by a specification that was evaluated at the time it was created, and not at the time of rendering. Thus, the attributes will be displayed throughout the life cycle of the same view in the same way as when creating the view for the first time.

, validate(), LengthValidator.

<f:validator validatorId="delegateLengthValidator" />
<f:attribute name="maximum" value="1000" />
<f:attribute name="buttonId" value="mainForm:add_Button" />

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);
}

, OmniFaces <o:validator>, :

<o:validator validatorId="javax.faces.Length" maximum="1000" disabled="#{!empty param['mainForm:add_Button']}" />

.

+1

All Articles