【问题标题】:Skip validation on re-render and apply only on form submit重新渲染时跳过验证,仅适用于表单提交
【发布时间】:2013-01-29 13:13:33
【问题描述】:

我有一个输入字段,用户可以在其中输入一些产品名称。根据输入的名称,应显示该产品的特定详细信息。在输入更改时,我通过当前字段值从数据源获取产品,并使用AJAX 重新呈现产品详细信息。到目前为止,用户必须输入正确的名称才能看到产品详细信息。

这是代码示例:

<h:form>
    <h:inputText id="product" value="#{myBean.product}" required="true" converter="productConverter">
        <a4j:ajax event="change" render="product, details"/>
    </h:inputText>

    <rich:message for="product" ajaxRendered="true"/>

    <h:panelGroup id="details">
        <h:outputText rendered="#{not empty myBean.product}" value="#{myBean.product.details}"/>
    </h:panelGroup>

    <a4j:commandButton execute="@form" render="@form" value="Validate" action="validate"/>
</h:form>

转换器

public class ProductConverter implements Converter {

public Object getAsObject(FacesContext context, UIComponent component, String name) {
    return (name != null && ProductDataSource.projectExist(name)) ? new Product(name) : null;
}

public String getAsString(FacesContext context, UIComponent component, Object value) {
    return (value instanceof Product) ? ((Product) value).getName() : "";
}

产品是必填字段,因此在输入正确名称之前无法提交表单。到目前为止,当用户输入错误的名称时,转换器返回 null 并且验证失败。但我想要的是仅在表单提交时验证此字段,并在重新呈现输入字段时跳过验证。我尝试在a4j:ajaxh:inputText 上应用immediate="true",但没有任何帮助。有任何想法吗?

提前致谢!

(我使用的是 JSF 2,Richfaces 4)

【问题讨论】:

标签: java validation jsf-2 richfaces


【解决方案1】:

只有在按下提交按钮时才让required 属性评估true。您可以通过在请求参数映射中检查其客户端 ID 的存在来做到这一点,如下所示:

<h:inputText ... required="#{not empty param[button.clientId]}" />
...
<a4j:commandButton binding="#{button}" ... />

(不,您不需要将其绑定到 bean 属性,代码按原样完成)

【讨论】:

    【解决方案2】:

    为了跳过您添加到表单中的 Jsf 验证 在 a4j:commandButton 中写入 immediate="true"

    【讨论】:

    • immediate="true" 添加到a4j:commandButton 将跳过提交验证。我想要相反的行为 - 仅在提交时验证
    【解决方案3】:

    尝试使用类似的东西

    <a4j:outputPanel ajaxRendered="true">
       <h:inputText id="product" value="#{myBean.product}" required="true" converter="productConverter">
          <a4j:support event="onchange" reRender="details" ajaxSingle="true"/>
       </h:inputText>
    
       <rich:message id="product" for="details" ajaxRendered="true">
       <h:panelGroup id="details">
          <h:outputText rendered="#{not empty myBean.product}" value="#{myBean.product.details}"/>
       </h:panelGroup>
    
    </a4j:outputPanel>
    

    主要思想是使用 ajaxSingle="true" 来避免完整的输出面板验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多