我有一个高度动态的单页面界面,其中各种用户事件触发新字段显示在屏幕上。我使用jsf 1.1和基本ajax而无法使用部分提交。由于这些限制,我已将所有字段标记为虚假且立即错误。这个想法是仅在用户尝试转换到动作方法中的下一页时才进行验证,而不是当它们选中并执行ajax事件时。我立即设置为false,因为我需要输入才能使其成为模态,因此我可以根据业务逻辑有条件地呈现某些字段。
问题:我提前知道“可能的”UIInput ID列表,它可能会在任何给定时间显示在屏幕上,也可能不会显示。我的目标是迭代所有这些UIInputs,检查它们是否被渲染,而不是null,而不是为空,否则将UIInput标记为错误。
除了屏幕上未显示的字段外,此方法有效。例如,我有一个字段“amountInput”,它将XHTML呈现属性设置为false,因此它不会显示在屏幕上。从显示的角度来看,这是有效的,但是在调用我的动作时,该字段仍然将其呈现的属性显示为true,因此我无法知道是否应该验证它。
我有什么选择?
public boolean validate() {
boolean hasValidMinimumData = true;
final List<UIInput> componentList = getComponentList();
if (CollectionUtils.isNotEmpty(componentList)) {
for (UIInput curComponent : componentList) {
final Object curComponentValue = curComponent.getValue();
if (curComponent.isRendered() && (curComponentValue == null || isNoValue(curComponent))) {
setError(curComponent); // applies the error
hasValidMinimumData = false;
}
}
}
return hasValidMinimumData;
}
答案 0 :(得分:1)
您需要注意在表单提交请求期间保留与rendered
属性结果完全相同的条件,就像在初始显示期间一样。
最简单的方法是将bean负责条件在会话范围内。如果您希望将其纳入请求范围(这是一个非常合理的决定),那么我建议您为此获取Tomahawk's t:saveState
。
<t:saveState value="#{bean}" />
那就是说,你有没有考虑过Ajax4jsf?它与JSF 1.1兼容,并提供Ajax与JSF的透明集成。
答案 1 :(得分:0)
解决!问题是,在我的XHTML中,我在包含输入组件的表组件上设置了呈现属性。我认为这会在所有孩子身上适当地设置渲染属性,但显然不是。
在我的XHTML中简单地在实际输入组件上设置条件渲染属性解决了这个问题。