【问题标题】:Issue with <f: validator> and ajax in JSFJSF 中 <f: validator> 和 ajax 的问题
【发布时间】: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} 是否指定为 &lt;p:dataTable var="myBean"&gt;
  • 不,myBean 是我的 @ManagedBean,它包含一个名为 bean 的属性,该属性包含 date 属性。
  • 所以...每一行中的日历输入都提交给一个相同的 bean 属性,覆盖之前行中所有提交的值,直到您最终只得到最后一行的值?为什么采用这种方法?将它们的值绑定到您在&lt;p:dataTable var&gt; 中指定的当前迭代的行对象不是更有意义吗?
  • 我没有使用数据表,我使用的是带有表单的面板网格,提交后会将数据加载到数据表中。
  • 无论如何,对我来说一个快速的解决方案是在 ajax 标签中添加一个 listener="",所以我在 bean 上进行验证。我不知道这是否是最好的方法,但可以解决我的问题。

标签: java jsf primefaces


【解决方案1】:

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

execute="@Form"

以上说法不正确。如果你想执行整个表单,这里的正确值是@form

纠正此问题后,txtStartDate 组件应更新其绑定值并可设置为txtEndDate 的属性。

【讨论】:

  • 我试过这个,但没有成功。此外,我尝试仅执行 txtStartDate 和 txtEndDate,但也没有成功。
  • 试试这个:execute="@this" render="yourFormId"
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果您使用的是 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" 以手动更改日期输入。它也可以用作日期选择。

    【讨论】:

      猜你喜欢
      • 2013-10-05
      • 2011-06-17
      • 2011-07-12
      • 2011-09-29
      • 1970-01-01
      • 2013-06-23
      • 2014-07-17
      • 2011-08-06
      相关资源
      最近更新 更多