如果两者都设置为必需,如何根据另一个下拉列表设置下拉值

时间:2010-06-03 15:14:43

标签: validation jsf selectonemenu ajax-update

如果在表单上将'required'设置为'true'的空元素,是否有人可以告诉我如何自动设置<h:selectOneMenu>(或任何其他组件)的值取决于另一个<h:selectOneMenu>?如果要设置<a4j:support event="onchange" reRender="anotherElement" immediate="true" />,则不会更改任何内容,因为未设置更改的值。但是没有immediate="true"我总是有消息说这个或那个元素不能为空。这是不起作用的代码示例。

<h:outputLabel value="* #{msg.someField}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:selectOneMenu id="someSelect"
            value="#{MyBean.someObj.someId}"
            required="true" label="#{msg.someField}"
            >
        <a4j:support event="onchange" reRender="anotherSelect" limitToList="true" immediate="true"/>
        <f:selectItem itemValue=""/>
        <f:selectItems value="#{MyBean.someList}"/>
    </h:selectOneMenu>
    <rich:message for="someSelect" styleClass="redOne"/>
</h:panelGrid>

<h:outputLabel value="* #{msg.anotherField}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:selectOneMenu id="anotherSelect"
            value="#{MyBean.someObj.anotherId}"
            required="true" label="#{msg.anotherField}"
            >
        <f:selectItem itemValue=""/>
        <f:selectItems value="#{MyBean.anotherList}"/>
    </h:selectOneMenu>
    <rich:message for="anotherSelect" styleClass="redOne"/>
</h:panelGrid>

<h:outputLabel value="* #{msg.name}: "/>
<h:panelGrid cellpadding="0" cellspacing="0">
    <h:inputText id="myName" value="#{MyBean.someObj.myName}" 
            required="true" label="#{msg.name}"/>
    <rich:message for="myName" styleClass="redOne"/>
</h:panelGrid>

所以,在这里(我再说一遍),如果我尝试改变'someSelect',那么'anotherSelect'应该更新它的值,但它不会,因为当它试图获得'someSelect'的值时,它变为null(如果{ {1}}设置为immediate)或表单验证在空元素上失败。如何跳过验证,但从'someSelect'获取此更改值?

2 个答案:

答案 0 :(得分:2)

您是否尝试将ajaxSingle="true"添加到someSelect a4j:support元素?删除immediate="true"

答案 1 :(得分:0)

以下解决方案适用于JSF 2.0

<h:outputLabel
    value="* Country: "/>
<h:selectOneMenu
    id="someSelect"
    value="#{testController.countryName}"
    required="true">
    <f:selectItem
        itemLabel="Select Country"
        itemValue=""/>
    <f:selectItems
        value="#{testController.countryNamesSelectItems}"/>
    <!-- This will only update "someSelect" and repaint "anotherSelect" -->
    <f:ajax
        execute="@this"
        render="anotherSelect"/>
</h:selectOneMenu>

<h:outputLabel
    value="* State: "/>
<h:selectOneMenu
    id="anotherSelect"
    value="#{testController.stateName}"
    required="true">
    <f:selectItem
        itemLabel="Select State"
        itemValue=""/>
    <f:selectItems
        value="#{testController.stateNamesSelectItems}"/>
</h:selectOneMenu>

f:ajax调用将在“someSelect”的更改时向服务器提交ajax请求。仅发生“someSelect”组件的模型更新(因为execute =“@ this”)。在渲染响应阶段,只会重新渲染“anotherSelect”(因此使用更新的国家/地区名称调用testController.stateNamesSelectItems)。

由于所有这一切,所选国家/地区的状态将更新为国家/地区更改时... ajax方式。

希望这有帮助。