【问题标题】:pass parameter from f:selectItems in h:selectOneListbox从 h:selectOneListbox 中的 f:selectItems 传递参数
【发布时间】:2012-09-01 14:22:47
【问题描述】:

我有一个 selectOneListbox,当单击它时,应该将一个附加参数 (id) 传递给服务器。就像现在一样,用户会看到一个名称列表,当他们选择一个时,我可以获得名称。但是,每个名称也有一个唯一的 id 与之关联,我不希望用户看到 - 如何在用户没有看到的情况下将所选名称的唯一 id 传递给支持 bean?可能吗?我试图弄清楚如何使用 f:param,但我不知道这将如何在这里工作。

                <h:selectOneListbox id="listBox" value="#{ScheduleMB.clients}" size="5"  
                rendered="#{ScheduleMB.showClients}" >
                    <f:selectItems value="#{ScheduleMB.clientList}" var="c"
                        itemLabel="#{c.lastName} #{', '} #{c.firstName}" itemValue="#{c.lastName}" />
                    <f:ajax event="click" listener="#{ScheduleMB.clickListener}"  
                        render="group" />
                </h:selectOneListbox>

【问题讨论】:

  • 您是否有任何理由没有将值设置为与名称关联的 ID?还是您希望 ID 不在页面上的任何位置(甚至隐藏在 HTML 的源代码中)?
  • 姓+名可能不是唯一的,所以我更喜欢id。我不希望看到 id,因为 1)用户可能会被它愚弄 2)我认为它不雅观。因此我想使用 id 但我不确定使用 jsf 将其发回的最佳方式。

标签: jsf jsf-2 facelets


【解决方案1】:

&lt;f:param&gt; 有不同的用途。即使&lt;f:param&gt; 是可能的,它最终仍然会在生成的 HTML 输出中可见。最终用户只需单击鼠标右键并查看源代码,然后将 ID 定义为选项值。

最好的办法是根据不同的唯一标识符从数据库中检索 ID,可能是名字+姓氏的唯一组合。

顺便说一句,你为什么要从输出中隐藏 ID 对我来说没有任何意义。如果您将其用作选项值会容易得多,如果您使用转换器则更容易,这样您就可以将整个 #{c} 作为选项值传递。最终用户不能以任何方式欺骗/更改它。 JSF 将根据可用选项列表(无论如何在服务器端定义)重新验证提交的值。

【讨论】:

  • 感谢您的回复。不幸的是,名字+姓氏可能不是唯一的,所以我想使用与每个客户端关联的数字 id,并且在 #{c} 对象中。不确定我是否完全理解您答案的最后一部分-我仍然是 jsf 新手。传递整个 #{c} 对象会很好,但我将如何做到这一点并仍然显示客户列表?
  • 您可以使用Converter 做到这一点。另请参阅此答案中的示例 #2:stackoverflow.com/questions/6848970/…
  • BalusC,好像就是这样。谢谢。
  • 请注意,您最终仍然会在生成的 HTML 输出中看到 ID。我不确定这是否是你想要的。如果您的意思是您不希望它显示在 UI 中,但您不在乎它是否在 HTML 源代码中,那么请继续(并且在将来,请注意如何在问题)。
  • 我不希望 ID 可见,但如果我没记错的话,如果我使用正确的话,我可以通过使用转换器来避免这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
  • 2018-02-25
相关资源
最近更新 更多