在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 是条件。这不是我的情况,因为这种方法会使验证失败时不会出现控件。
答案 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字段旁边绘制一个图标。