仅在验证成功时呈现组件

时间:2015-09-08 05:34:04

标签: validation jsf jsf-2 conditional-rendering

在JSF 2.X中,我可以仅在验证成功时呈现组件吗?

在我的应用程序中,我有许多必须填写的字段。可以通过搜索键从WebService导入这些数据。

当用户输入有效的搜索关键字时,系统会搜索其他字段并使用新值进行渲染。但是当用户输入不存在的密钥(或任何其他验证错误)时,服务器会生成验证错误,但仍会呈现字段,从而丢失所有已填充的数据。

我需要的是用户可以执行查询,如果查询没有返回结果,这不会影响他已经输入的任何数据。

下面是一个代码示例。因此,如果用户已填写 updateThisOnSuccess 内的字段,并且在尝试查询但未成功之后,则填写的值不会丢失。

    <h:inputText value="#{controller.searchWebService}" >
        <f:ajax execute="@this" render="updateThisOnSuccess messages" />
    </h:inputText>

    <h:panelGroup id="updateThisOnSuccess">
        <h:inputText value="#{controller.field}" />
        <!-- other fields -->
    </h:panelGroup>

提交字段值以运行搜索似乎也不是一个选项,因为这将导致需要验证 updateThisOnSuccess 中的字段。

注意:我看到@BalusC给出了类似问题的the answer,但这与我想知道为什么不同,在这种情况下, foo-holder 是总是渲染, foo 是条件。这不是我的情况,因为这种方法会使验证失败时不会出现控件。

4 个答案:

答案 0 :(得分:1)

试试这个

<h:panelGroup id="updateThisOnSuccess">
    <ui:fragment rendered="#{not facesContext.validationFailed}">
        <h:inputText value="#{controller.field}" />
        <!-- other fields -->
    </ui:fragment>
</h:panelGroup>

答案 1 :(得分:0)

您可以更改将在渲染阶段处理的组件,更改getRenderIds() PartialViewContext处的集合。根据{{​​3}},此集合是可变的

FacesContext.getCurrentInstance().getPartialViewContext().getRenderIds().remove("formName:updateThisOnSuccess");

为了测试这个解决方案,我使用了这个控制器:

@Named
@ViewScoped
public class Controller implements Serializable {

    private static final long serialVersionUID = 1L;

    private final static List<String> LIST_VALID_WEB_SERVICE_SEARCHS =
        Arrays.asList(new String[] {"foo", "bar"});

    private String webServiceParameter;
    private Integer field01;

    public void searchWebService() {

        if (LIST_VALID_WEB_SERVICE_SEARCHS.contains(getWebServiceParameter())) {
            setField01(123);
        } else {

            FacesContext facesContext = FacesContext.getCurrentInstance();

            facesContext.getPartialViewContext().getRenderIds().remove("formFields");

            FacesMessage facesMessage = new FacesMessage("Search not found in WebService.");
            facesMessage.setSeverity(FacesMessage.SEVERITY_ERROR);
            facesContext.addMessage("formName:searchWebService", facesMessage);
        }
    }

    public void submit() {
        System.out.println("submitted");
    }

    // Getters and Setters
}

并使用了这个观点:

<h:form id="formSearch">
    <h:inputText id="webServiceParameter" value="#{controller.webServiceParameter}">
        <f:ajax execute="@this" render="formFields messages" listener="#{controller.searchWebService}" />
    </h:inputText><br />
</h:form>

<h:form id="formFields">
    <h:inputText id="field01" value="#{controller.field01}" required="true">
        <f:validateLongRange minimum="2" maximum="345" />
    </h:inputText><br />
    <!-- other fields -->

    <h:commandButton value="submit" action="#{controller.submit}">
        <f:ajax render="@form messages" execute="@form" />
    </h:commandButton>
</h:form>

<h:messages id="messages" />

答案 2 :(得分:0)

Plaase尝试这个。要求是您必须使用Bean Validation实现模型验证,并且搜索字段必须在必要时实现JSF验证。 如果你写“123456”然后返回数据,否则不会返回任何内容并打印一条消息。

支持bean:

<h:form id="form01">
<h:messages id="message"/>
    <h:inputText id="wsid" value="#{pruebasBorradorBean.searchWebService}">
        <f:validateLength maximum="6"/>
        <f:ajax execute="@form" render="@form" listener="#{pruebasBorradorBean.searchWebServiceF()}" />
    </h:inputText>

    <h:panelGroup id="thedata">
        <h:inputText value="#{pruebasBorradorBean.field01}">
            <f:validateBean disabled="#{param['javax.faces.source']!='form01:save'}"/>
        </h:inputText>
        <!-- other fields -->
    </h:panelGroup>
    <h:commandButton id="save" value="submit">
        <f:ajax render="thedata message" execute="@this thedata" listener="#{pruebasBorradorBean.saveF()}"/>
    </h:commandButton>

</h:form>

在您的信息页中:

{{1}}

答案 3 :(得分:-1)

你可以这样做:

return [ // ... 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], // ... ], ];

其中RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=cc&VarA=$1&VarB=$2&VarC=$3 [L] RewriteRule ^([^/]*)/([^/]*)/$ /index.php?mode=bb&VarA=$1&VarB=$2 [L] 是一个String属性,如果WS失败则为空,如果没有则为“updateThisOnSuccess”。

或者你可以摆脱JSF验证机制来通知用户WS失败了。想一想,它并不是模型的真正验证。您可以使用支持bean中的boolean flag属性以红色或类似的方式在WS Id字段旁边绘制一个图标。