表单字段渲染依赖于selectOneMenu时出现JSF / Primefaces问题

时间:2013-06-23 06:02:08

标签: jsf primefaces page-refresh update-attribute

表单字段呈现取决于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>

支持bean:

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;
  }
}

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

我做错了吗?有优雅的解决方案吗?

0 个答案:

没有答案