【问题标题】:Single select <g:select> is producing more than one "selected" item by default单选 <g:select> 默认情况下会产生多个“选定”项目
【发布时间】:2013-03-21 09:18:00
【问题描述】:

我的一个 GSP 中有一个 &lt;g:select&gt;,如下所示:

<g:select id="location" name="criteria.location" from="${example.Location.list()}" optionKey="id" required="" value="1" class="many-to-one"/>

预期的结果应该是这样的,对吧?

预期结果:

<select id="location" name="criteria.location" required="" class="many-to-one" >
    <option value="1" selected="selected" >1st Location Name</option>
    <option value="2" >2nd Location Name</option>
    <option value="3" >3rd Location Name</option>
    <!-- entries omitted -->
    <option value="49" >49th Location Name</option>
    <option value="50" >50th Location Name</option>
</select>

但是我得到了什么?我最终选择了 两个 项。第 49 个选项也被选中,我无法想象为什么!在我的代码中绝对没有提到值“49”...

实际结果:

<select id="location" name="criteria.location" required="" class="many-to-one" >
    <option value="1" selected="selected" >1st Location Name</option>
    <option value="2" >2nd Location Name</option>
    <option value="3" >3rd Location Name</option>
    <!-- entries omitted -->
    <option value="49" selected="selected" >49th Location Name</option>
    <option value="50" >50th Location Name</option>
</select>

例如,如果我将 &lt;g:select&gt; 中的 value 更改为“3”,则会选择第 3 个选项,但无论出于何种原因,第 49 个项目仍会被选中。

编辑:更奇怪的是,如果我将value 属性更改为大于 49 的值,则选择有效并且只选择了第n 个选项!

更新:我发布了一个答案,详细说明了它是如何工作的,但我仍然不明白 &lt;g:select&gt; 标记的原始行为。

有人知道这里发生了什么吗?


Grails 版本: 2.2.0

【问题讨论】:

  • 选项 49 被“1”选中,因为“1”的 ASCII 值为 49(我刚刚花了半天的时间来跟踪同一个 bug。Arghhhh)

标签: grails gsp html-select


【解决方案1】:

我知道我来晚了,但我今天遇到了这个问题。 首先,我认为这实际上是一个错误,不知道是否被报告,但可能与数据类型有关。
您的方法工作正常,但仅当我们不需要动态选择值时。为此,只需将绑定的值转换为 Integer(Long 或您要查找的任何类型),如下所示:

<g:select id="location" name="criteria.location" from="${example.Location.list()}" optionKey="id" required="" value="${yourVarName as Integer}" class="many-to-one"/>

也可以在fieldValue之后使用。 我希望它可以帮助某人,并回答您关于为什么会发生这种情况的问题。但实际上,它应该被报告为一个错误。

【讨论】:

    【解决方案2】:

    我想出了如何让它工作,但我仍然无法解释&lt;g:select&gt; 标签的行为。我将value 属性更改为“${1}”而不是“1”,如下所示:

    <g:select id="location" name="criteria.location" from="${example.Location.list()}" optionKey="id" required="" value="${1}" class="many-to-one"/>
    

    我认为标签将我的值解释为字符串而不是数字,但我仍然看不到 &lt;g:select&gt; 标签如何允许选择控件不是多选默认情况下选择多个项目。对我来说,这看起来像一个错误。

    【讨论】:

    • "1" 是 49(ASCII 格式)。 “${1}”是数字 1。
    【解决方案3】:

    为它使用 value 属性

    value="${location ?: 49}"  
    

    例如

    <g:select id="location" name="criteria.location" from="${example.Location.list()}" optionKey="id" required="" value="${location ?: 49}" class="many-to-one"/>
    

    【讨论】:

    • 这和我做的差不多,但是我还是不明白为什么我原来的value会导致多选。你能给我解释一下吗?
    • @Stephan 我在这段代码中没有看到问题。可能是代码另一部分的问题
    • 关于可能导致这种逻辑错误的任何线索?我是 Go Grails 的新手,而且没有比这更多的代码了......
    猜你喜欢
    • 2010-12-11
    • 2016-04-15
    • 2014-01-27
    • 2012-08-09
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多