immediate =“true”和必填字段问题

时间:2011-09-12 21:40:59

标签: jsf

我遇到了立即=“真”的问题(JSF 1.2)。我的表格是关于车祸的:用户填写一些使用信息,然后他可以根据自己的意愿添加尽可能多的受影响物品(树木,栅栏,其他汽车等)

支持bean

private String location;
private List<T> items;
private HtmlDataTable itemsUI;

public void remove(ActionEvent e) {
    String id = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("id");
    items.remove(Integer.parseInt(id));
}   

public void add(ActionEvent e) throws InstantiationException, IllegalAccessException {
    items.add(element.newInstance());
}

JSPX

<h:inputText 
required="true"
value="#{ACC01.location}"/>

<h:dataTable
binding="#{ACC01.itemsUI }"
value="#{ACC01.items}"
var="item">
<h:column>
    <h:selectOneMenu
    value="#{item.id}>
        <f:selectItems  
        value="#{ACC01.possibleElements}" />
    </h:selectOneMenu>

    <h:commandLink 
    actionListener="#{ACC01.remove }"
    value="Remove"  >
        <f:param 
        name="id" 
        value="#{ACC01.itemsUI.rowIndex }"/>
    </h:commandLink>    
</h:column>
</h:dataTable>

<h:commandLink 
actionListener="#{ACC01.add}"
value="Add"  />

问题

  • 如果我为dataTable中受影响的元素设置了immediate =“true”,当用户添加新元素时,其他元素将返回其默认值(例如,如果你有{'tree','car' ,'fence'}它们变为{'默认','默认','默认',新元素})

  • 如果我不立即使用,受影响的元素会保留正确的值,但在添加或删除受影响的元素之前,用户必须填写“位置”字段。

我想要的是能够保留受影响元素的值,并允许用户添加或删除它们,而无需先填写“位置”字段。

解决方法

在阅读了很多关于这个主题的帖子后,似乎唯一的方法就是避免自动验证,并在用户提交表单时手动进行。

检查必填字段的空值,并以编程方式将错误消息附加到facescontext。我真的不想这样做,因为我觉得它很难看。

您能否建议更好的方法来实现我需要的行为?

提前致谢

1 个答案:

答案 0 :(得分:3)

我目前工作的一位先前的开发人员提出了以下解决方案

JSPX

<h:inputText required="#{ACC01.saving}" value="#{ACC01.location}"/>

支持Bean

private UICommand btn;

public boolean isSaving()
{
    Map<?,?> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
    return (params.containsKey(btn.getClientId(ctx)));
}

在你的情况下可能不完全正确,但基本上他创建了一个从屏幕上的按钮到支持bean中的'btn'变量的绑定。然后inputText只会在单击btn时看到所需的位置文本。在你的情况下,它是一个命令链接,所以它可能会有所不同,但我认为它可能有所帮助。