5

我想在用户执行操作之前验证表单中的两个日期。所以我在 ap:calendar 中得到了 af:validator 与 ajax 一起工作,问题出在 f:attribute 上。我将开始日期作为参数传递,验证器没有收到此日期。但是,如果按下操作按钮,则日期参数在验证中。我正在使用这篇文章作为指南。我的 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);
    }
}

感谢任何帮助。

4

3 回答 3

1

我在这里看到了几个问题:

execute="@Form"

以上是不正确的。如果您希望执行整个表单,则此处的正确值为@form.

更正此问题后,txtStartDate组件应更新其绑定值,并可将其设置为txtEndDate.

于 2013-02-15T14:26:12.380 回答
0

无论如何,对我来说一个快速的解决方案是在 ajax 标记中添加一个 listener="",所以我正在 bean 上进行验证。我不知道这是否是最好的方法,但可以解决我的问题。

于 2013-02-19T12:32:30.680 回答
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"手动更改日期输入。它也可以用作日期选择。

于 2019-07-08T06:57:08.407 回答