【发布时间】:2013-02-15 13:28:35
【问题描述】:
我想在用户执行操作之前验证表单中的两个日期。所以我在使用 ajax 的 p:calendar 中有一个 f:validator,问题出在 f:attribute 上。我将开始日期作为参数传递,验证器没有收到此日期。但是,如果按下操作按钮,则日期参数在验证中。我使用这个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);
}
}
感谢任何帮助。
【问题讨论】:
-
EL 表达式
#{myBean.bean.startDate}有点奇怪。#{myBean}是否指定为<p:dataTable var="myBean">? -
不,myBean 是我的 @ManagedBean,它包含一个名为 bean 的属性,该属性包含 date 属性。
-
所以...每一行中的日历输入都提交给一个相同的 bean 属性,覆盖之前行中所有提交的值,直到您最终只得到最后一行的值?为什么采用这种方法?将它们的值绑定到您在
<p:dataTable var>中指定的当前迭代的行对象不是更有意义吗? -
我没有使用数据表,我使用的是带有表单的面板网格,提交后会将数据加载到数据表中。
-
无论如何,对我来说一个快速的解决方案是在 ajax 标签中添加一个 listener="",所以我在 bean 上进行验证。我不知道这是否是最好的方法,但可以解决我的问题。
标签: java jsf primefaces