【问题标题】:Target model Type is no a Collection or Array目标模型类型不是集合或数组
【发布时间】:2012-10-06 16:14:17
【问题描述】:

我使用 JQuery 在 2 个选择多个列表框之间移动元素(来回)。下面是我的 JQuery 代码。

<script type="text/javascript">

$(document).ready(function() {
    alert('inside function');
    $('#testForm\\:button_add').click(function(e) {
    var selectedOpts = $("#testForm\\:select_from option:selected");
    if (selectedOpts.length == 0) {
    alert("Nothing to move.");
    e.preventDefault();
    }
    $('#testForm\\:select_to').append($(selectedOpts).clone());
    $(selectedOpts).remove();
    e.preventDefault();
    });
    $('#testForm\\:button_remove').click(function(e) {
    var selectedOpts = $("#testForm\\:select_to option:selected");
    if (selectedOpts.length == 0) {
    alert("Nothing to move.");
    e.preventDefault();
    }                                               
    $('#testForm\\:select_from').append($(selectedOpts).clone());
    $(selectedOpts).remove();
    e.preventDefault();
    });
    });

</script>

下面是我的 JSF 代码:

<td width="40%">
    <h:selectManyListbox value="#{testListBox.selectManyOptions}" id="select_from" size="5" >

    <f:selectItems value="#{testListBox.selectedOptions}" />
</h:selectManyListbox>
</td>
<td></td>
<td width="40%">
    <h:commandButton value="To" id="button_add"/><br/>
    <h:commandButton value="From" id="button_remove"/>
</td>
<td></td>
<td>
    <h:selectManyListbox id="select_to" size="5"
                        value="#{testListBox.selectedItems}">
    <f:selectItems />
</h:selectManyListbox>
</td> 
<td></td>

在页面 bean 中,我已经声明了相应的绑定变量,如下所示,分别带有相应的 getter/setter。

private Map<String, Object> selectedOptions;
private Map<String, Object> selectManyOptions;

private List<SelectItem> selectItems = new ArrayList<SelectItem>();
private List<String> selectedItems;

现在我在提交页面时遇到错误。 “目标模型类型不是集合或数组” 任何人都可以建议它阻止我的导航吗? - 瓦姆西

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    您的具体问题是因为您使用Map 而不是CollectionObject[] 作为value&lt;h:selectManyListbox&gt;。该组件不支持将 Map 作为值。

    如果你替换

    private Map<String, Object> selectedOptions;
    private Map<String, Object> selectManyOptions;
    

    通过

    private List<String> selectedOptions;
    private List<String> selectManyOptions;
    

    (或String[]

    那么这个特殊问题应该会消失。


    与具体问题无关,在你解决了这个问题之后,你无疑会面临一个新的问题。为了避免再次问另一个问题,这里是答案:How to create a picklist in JSF? Tried moving items using JS/jQuery, but submit errors with "Validation Error: Value is not valid"

    【讨论】:

    • 谢谢巴鲁。您的代码正在运行。不过,我只需要对我的要求做一些修改。但是您真的是说 JQury/java 脚本设置的值(我知道它将在客户端运行)不能由 JSF 处理吗?它可以被隐藏变量处理吗?在这种情况下,CLIENT 的 STATE_SAVING_METHOD 属性也会帮助我们(可能是一个愚蠢的问题)让 JSF 知道 JQuery 设置的值吗?
    • 同意感谢您的及时回复。最后一个疑问。我将在此之后做出接受的答案:-)在这种情况下,是否存在不使用隐藏变量的其他方法,以便 JSF 可以读取由 JQuery/java 脚本设置的值?
    • 没有。您必须以某种方式保持 JSF 状态同步。将数据从客户端传输到服务器的唯一方法是作为 HTTP 请求参数。您可以使用标准 JSF 组件(其值由 EL 直接绑定到 bean 属性)轻松完成,或者使用 JavaScript 和隐藏输入并手动收集它们的笨拙方法。
    • hi balu...最初我认为您的代码可以正常工作,但实际上并非如此。 leftSelected 项目正在从左向右移动,并且正在添加 rightAvailable 并且显示也正确。但在此之后,当我尝试单击“从右到左”时,我可以看到 rightAvailable 具有空值,实际上所有项目都被添加到 leftAvailable 而不是 rightSelected 项目。正如我上面所说,“从左到右”工作正常。我很好奇。 shud bean的范围需要是SessionScope吗?在我的项目中不建议使用会话范围。
    • 将 bean 的范围更改为 'SessionScoped' 后工作正常。
    【解决方案2】:

    你有&lt;f:selectItems value="#{testListBox.selectedOptions}" /&gt;,其中 selectedOptions 是一个不是集合的 Map。 在f:selectItems 的值中使用SelectItem 的集合。

    【讨论】:

      猜你喜欢
      • 2013-01-18
      • 2011-03-20
      • 1970-01-01
      • 2018-07-07
      • 2017-01-17
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      相关资源
      最近更新 更多