0

表单字段渲染取决于 selectOneMenu 中的选定项。

页:

  <h:body>
    <f:view>
      <h:form>

        <h:panelGrid>
          <p:inputText value="#{user.username}"/>
          <p:selectOneMenu value="#{user.moreInputs}"
                           required="true">
            <p:ajax event="change"
                    update="moreInputGrid"/>
            <f:selectItem itemLabel="" itemValue=""/>
            <f:selectItems value="#{user.selectItems}"/>
          </p:selectOneMenu>
        </h:panelGrid>

        <h:panelGrid id="moreInputGrid">
          <p:inputText rendered="#{user.renderMoreInputs}"
                       value="#{user.name}"/>
        </h:panelGrid>

        <p:commandButton action="#{user.register}"
                         value="Register user"/>

      </h:form>
    </f:view>
  </h:body>

支持豆:

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

@ManagedBean
@ViewScoped
public class User {
  private String username;
  private MoreInputs moreInputs;
  private String name;

  public enum MoreInputs {
    YES,
    NO
  }

  public boolean isRenderMoreInputs() {
    return (moreInputs == MoreInputs.YES);
  }

  public SelectItem[] getSelectItems() {
    SelectItem[] items = new SelectItem[2];
    items[0] = new SelectItem(
                      MoreInputs.YES,
                      "yes");
    items[1] = new SelectItem(
                      MoreInputs.NO,
                      "no");

    return items;
  }

  public String register() {
    return null;
  }

  public String getUsername() {
    return username;
  }

  public void setUsername(String username) {
    this.username = username;
  }

  public MoreInputs getMoreInputs() {
    return moreInputs;
  }

  public void setMoreInputs(MoreInputs moreInputs) {
    this.moreInputs = moreInputs;
  }

  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

如果客户端在选择导致表单字段呈现的项目后刷新页面,则会出现问题。此类表单字段不会在页面刷新时呈现,尽管它们应该。另外,如果客户端随后尝试提交表单,则会跳过这些隐藏字段的验证,并成功处理表单。

难道我做错了什么?有没有优雅的解决方案?

4

0 回答 0