我想在用户执行操作之前验证表单中的两个日期。所以我在使用ajax的p:calendar中得到了一个f:validator,问题在于f:属性。我将开始日期作为参数传递,验证器未收到此日期。但是,如果按下操作按钮,则日期参数将在验证中。我使用此post作为指南。 我的xhtml是:
<p:column >
<p:calendar id="txtStartDate" binding="#{txtStartDate}"
pattern="dd/MM/yyyy"
value="#{myBean.bean.startDate}">
</p:calendar>
</p:column>
<p:column>
<p:calendar id="txtEndDate"
pattern="dd/MM/yyyy"
value="#{myBean.bean.endDate}">
<f:validator validatorId="validator.dateRangeValidator" />
<f:attribute name="fromDate" value="#{txtStartDate.value}" />
<p:ajax event="dateSelect" execute="@Form" update=":formHeader:messages" />
</p:calendar>
</p:column>
验证员:
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
if (value == null || component.getAttributes().get("fromDate") == null) return;
Date endDate = (Date) value;
Date startDate = (Date) component.getAttributes().get("fromDate");
if (!endDate.after(startDate)) {
FacesMessage message = new FacesMessage("End date before the start date.");
message.setSeverity(FacesMessage.SEVERITY_ERROR);
addMessageOnSession(FacesMessage.SEVERITY_ERROR, "Invalid dates");
throw new ValidatorException(message);
}
}
感谢任何帮助。
答案 0 :(得分:1)
我在这里看到了几个问题:
execute="@Form"
以上是不正确的。如果您希望执行整个表单,则此处的正确值为@form
。
纠正此问题后,txtStartDate
组件应更新其绑定值,并可设置为txtEndDate
的属性。
答案 1 :(得分:0)
无论如何,我的快速解决方案是在ajax标签中添加一个listener =“”,所以我在bean上进行验证。我不知道这是否是最好的方法,但解决了我的问题。
答案 2 :(得分:0)
如果您使用的是 Primefaces ,则发送参数有问题。他们不支持日期。
您的代码:
Date startDate = (Date) component.getAttributes().get("fromDate");
您必须获取日期作为UIInput并进行解析。
final UIInput startDate = (UIInput) component.getAttributes().get("fromDate");
final String dateFromString = (String) String.valueOf(startDate.getValue());
final SimpleDateFormat parserSDF = new SimpleDateFormat("EEE MMM dd HH:mm:ss Z yyyy", Locale.ENGLISH);
final Date parsedDateTo = parseDate(parserSDF, dateFromString);
要更新表单,请使用:
execute="@this" render="yourFormId"
下一个提示:
您可以将f:ajax event="dateSelect"
更改为f:ajax event="change"
以进行手动更改日期输入。它也可以作为日期选择。