ListContainsNoCase、ValueList、自定义分隔符和多个 select 菜单中的前置项 select

ListContainsNoCase, ValueList, custom delimiters and preselecting items in a multiple select menu

我正在尝试根据已转换为竖线分隔的 ValueList 的数据库查询在多个 select 菜单中预置 select 项。除了我身边的一根刺外,一切正常。

如我所说,该列表是竖线分隔的,但在某些列表项中包含逗号。 (即 Communications (pagers, cell phones, etc.))。当我执行 listContainsNoCase() 时,寻找匹配项一切正常,直到遇到逗号。我期望的比赛不会像这样回来。它被忽略了。如果我排除逗号作为分隔符,为什么它们似乎 不会 被忽略?请参阅下面的代码示例。

<!---All possible categories pulled from the category table--->
<cfset allCategories = valueList(catdata.memberCategory, "|")>
<!---All category results that exist for a specific user's record--->
<cfset currentUserCategories = valueList(getUserRecord.categories, "|")>

<!---Multi select menu:--->
<label class="select select-multiple">
   <cfoutput>
   <select multiple="multiple" name="categories" id="categoriesA" style="height:200px;">
      <cfloop list="#allcategories#" index="i" delimiters="|">
         <option value="#trim(i)#" 
            <cfif listcontainsnocase(currentUserCategories, i)>selected="selected"</cfif>>
            #trim(i)#
         </option>
      </cfloop> 
   </select>
   </cfoutput>
</label>

Screenshot (blue text is currentUserCategories output):

所以我的问题是为什么菜单项 Communications (pagers, cell phones, etc) 被忽略了,我如何让我的代码包含它?

这是因为您没有指定 | 作为该函数的分隔符。所以 ListContainsNoCase 实际上是在使用它的默认值:逗号。您需要将分隔符指定为 |.

也就是说,它可能不是正确的函数。 ListContainsNoCase() 搜索部分匹配项,因此您可能会得到一些误报。由于您试图匹配整个列表元素,因此您应该使用 ListFindNoCase():

<cfif ListFindNoCase(listToSearch, valueToFind , "|")>

最后,如果您的 table 具有唯一的类别数字 ID(应该如此),请考虑在相关 table 和列表值中使用该 ID,而不是文本。这避免了这种定界符问题。此外,在多个 table 中存储相关文本值时可能会发生存储 id minimizes inconsistencies