1

我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们应该接受每个输入。

这样我就不能使用普通的验证器,但是有一个 commandButton 来评估它的 action Method 中的数据,并在缺少某些东西时创建一些与特定 clientIds 相关的 FacesMessages。

现在我通常使用OmniFaces o:highlight组件来指向需要进一步操作的字段,但在这种情况下,输入组件是有效的,因此突出显示组件不会考虑它们。

现在我想知道这种行为是否可能取决于带有消息的 ID 列表。

像这样的东西:

for (Iterator<String> it = FacesContext.getCurrentInstance()
                .getClientIdsWithMessages(); it.hasNext();) {
        String clientId = it.next();
        List<FacesMessage> messageList = FacesContext
                .getCurrentInstance().getMessageList(clientId);
        if (messageList != null) {
            for (FacesMessage msg : messageList) {
                ... // build json with clientIds (maybe check for UIInput
            }
        }
}

如果需要这种方式,可以为信息、警告和错误消息引入新的样式类。也许它甚至更快,因为不必访问整个组件树,但这只是一个猜测。

那你怎么看?这是对当前行为的一个相当艰难的改变,所以我不确定这个猜测是否会使其成为全能面或必须单独实施。

4

1 回答 1

0

现在我想知道这种行为是否可能取决于带有消息的 ID 列表。

从与您在此处链接的相同方法的 javadoc 中:

请注意,FacesContext#getClientIdsWithMessages()也可以查询,但它不指示与这些客户端 ID 关联的组件是否实际上是UIInput组件,而不是UIInput#isValid()

因此,您仍需要使用每个客户端 IDUIViewRoot#findComponent()来查找组件、确定其类型并验证其有效性。这比一次树访问要昂贵得多。

如果您确实需要在操作方法中执行验证,最好的办法是自己将上下文和输入标记为无效。

FacesContext context = FacesContext.getCurrentInstance();
context.validationFailed();
((UIInput) context.getViewRoot().findComponent(clientId)).setValid(false);

或者,为了满足具体的功能要求,

我有一些输入组件,只有在所有其他情况下执行特定操作时才应该验证它们应该接受每个输入。

只需使用一个普通的验证器,您可以在其中检查调用的操作:

public void validate(FacesContext context, UIComponent component, Object value) {
    if (!context.getExternalContext().getRequestParameterMap().containsKey("formId:buttonId")) {
        return;
    }

    // ...
}

即当<h:form id="formId"><h:commandButton id="buttonId">被调用时,将执行验证。这总是比在错误的地方执行验证要好。

于 2013-06-20T13:11:01.720 回答