3

我想在按下按钮添加和按钮删除时禁用验证,所以我尝试了这个

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

按钮添加已经被禁用,但是按钮删除还没有。而且我不知道有什么问题!这是我的代码,你们能帮我检查一下吗。抱歉我的英语不好

<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>

4

1 回答 1

1

<f:validateLength>是一个标签处理程序,而不是一个 UI 组件。所有 taghandler 属性都是在视图构建时按规范评估的,而不是在视图渲染时。因此,在同一视图的整个生命周期中,属性将保持与第一次构建视图时相同的值。

您基本上需要创建一个自定义验证器来检查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']}" />

在此处查看展示示例。

于 2012-05-25T12:25:54.213 回答