【问题标题】:p:selectOneMenu does not set value in beanp:selectOneMenu 没有在 bean 中设置值
【发布时间】:2012-10-30 20:54:36
【问题描述】:

快速提问。在使用 SelectOneMenu 时,我以前没有发生过这种情况。这是我的代码。

<h:outputLabel for="listaRegiones" value="Región: " />
<p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true">
    <f:selectItems value="#{nuevaProvincia.regiones}" />
</p:selectOneMenu>
<p:message for="listaRegiones" />

这是我的支持 bean。

@ManagedBean(name="nuevaProvincia")
@ViewScoped
public class nuevaProvincia implements Serializable {

    public static final long serialVersionUID = 1L;

    public nuevaProvincia() throws DAOException {
        this.provincia = new Provincia();
        this.regiones = new ArrayList<SelectItem>();
        ArrayList<Region> regs = new ArrayList<Region>();
        try
        {
            regs = Region.obtenerRegiones();
        }
        catch(DAOException e)
        {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage()));
        }
        if(regs.size()>0)
        {
            for(Region r : regs)
            {
                SelectItem item = new SelectItem(r.getCodigo(), r.getNombre());
                regiones.add(item);
            }
            this.regionSelect = regs.get(0).getCodigo();
        }
        else
            this.regionSelect = "";
    }

    public void verificaProvincia() throws DAOException {
        provincia.getRegion().setCodigo(regionSelect);
        try
        {
            if(this.provincia.estaCreado())
                FacesContext.getCurrentInstance().addMessage("frmIngProvincia:provCodigo", new FacesMessage(FacesMessage.SEVERITY_WARN, "El código de provincia ingresado ya existe.", "El código de provincia ingresado ya existe."));
            else
                FacesContext.getCurrentInstance().addMessage("frmIngProvincia:provCodigo", new FacesMessage(FacesMessage.SEVERITY_INFO, "El código de provincia ingresado no existe.", "El código de provincia ingresado no existe."));
        }
        catch(DAOException e)
        {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_FATAL, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage()));
        }
    }

    public void insertaProvincia() throws DAOException {
        try
        {
            provincia.getRegion().setCodigo(regionSelect);
            provincia.guardar();
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Provincia ingresada con éxito", "Provincia ingresada con éxito"));
        }
        catch(DAOException e)
        {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Hubo un error: "+e.getMessage(), "Hubo un error: "+e.getMessage()));
            throw e;
        }
    }

    //Getters and setters for everything        

    //Privados
    private Provincia provincia;
    private String regionSelect;
    private List<SelectItem> regiones;
}

问题如下:每当我更改我的 selectonemenu 中的值时,没有设置支持 bean 中的值(尽管我确实有一个用于 regionSelect 的设置器)。为什么会这样?

【问题讨论】:

  • 如果你的行 SelectItem item = new SelectItem(r.getCodigo(), r.getNombre());将 String 作为 ItemValue 以外的其他内容,您将收到错误值错误(您可以尝试使用 来查看是否出现问题)
  • SelectItem 中设置的两个值都是字符串,&lt;h:messages globalOnly="false" /&gt; 没有告诉我任何新信息。
  • 您在此表单中还有其他字段吗?如果是,是否更新了其他字段?
  • 我刚刚测试了一个字段,是的,它已正确更新。
  • 什么...我并没有真正做任何改变,它正在工作。谢谢。

标签: jsf primefaces selectonemenu updatemodel


【解决方案1】:

如果您正在处理值中的对象,请检查 equals() 函数。

【讨论】:

    【解决方案2】:

    当我遇到这个问题时,我发现这是因为@ViewScoped。改用 SessionScoped 效果很好。

    一个有趣的事情是,在另一个项目中,ViewScoped,它起作用了。我无法解释。

    【讨论】:

    • 您很可能使用了错误的 @ViewScoped@Named/@ManagedBean 注释组合。如果您选择了错误的@SessionScoped,它将无法...
    【解决方案3】:
    <p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true">
        <f:selectItems value="#{nuevaProvincia.regiones}" />
    </p:selectOneMenu>
    

    应该是

    <p:selectOneMenu id="listaRegiones" value="#{nuevaProvincia.regionSelect}" required="true">
        <f:selectItems value="#{nuevaProvincia.regiones}" var="region" 
          itemValue = "#{region}"/>
    </p:selectOneMenu>
    

    这就是为什么您必须在有更改时调用 ajax 来更新。您永远不会设置值。

    【讨论】:

    • var="region" itemValue="#{region}" 这样做是否受到质疑?
    【解决方案4】:

    我发现了错误,它是……非常奇怪和间接的。我在 SelectOneMenu 中添加了以下行:

    <p:ajax event="change" update="@this" />
    

    现在它工作得很好。

    【讨论】:

    • 好极了,我还在用 RichFaces,所以我觉得有些不同!
    • 两者的行为可能完全不同!
    • 这是预期的行为。您的示例将在表单提交上设置 selectOneMenu 值。如果你想用ajax设置它,你必须指定它。请将您的帖子标记为答案。
    • 我将把它标记为我的答案,只是我必须等到明天。另外,这是否意味着我应该在运行时验证的每个SelectOneMenu 中放置一个p:ajax
    • 我和inputTexfield有同样的情况,是否需要同样使用ajax?
    猜你喜欢
    • 2013-10-10
    • 1970-01-01
    • 2014-06-11
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多