0

好吧,所以人们没有清楚地理解我的问题,所以我删除了其他人已经提出问题的网址,但我没有得到完美的答案..

所以这里是问题......

我希望在 ColdFusion 中编写一个动态下拉列表。我想要的是由上述下拉列表填充的下拉列表(例如:选择省(BC)将使用该省内的所有城市填充城市下拉列表)。省数据将从 ColdFusion 查询中收集,并与城市数据相同。

请不要使用 JavaScript,不要 AJAX,不要使用 ColdFusion CFC,不要多于或少于一些 ColdFusion 标签... :( 逻辑代码应位于一个 .cfm 文件本身中。

  • 编辑 -

@查尔斯·希金斯

似乎无法让它工作。它抛出“调用 CFC BinFcns.cfc 时出错:内部服务器错误”“请告诉我哪里做错了,这里是代码..

这是'index.cfm'

<cfquery name="qstates" datasource="info">
  SELECT states
  FROM info

  GROUP BY states
</cfquery> 
<html> 
<head> 
</head> 
<body> 
<cfform>
<cfselect name="DropDown1" bind="cfc:BinFcns.Method({DropDown1})">
    <cfoutput query="qstates"><option>#states#</option></cfoutput>
</cfselect>
<cfselect name="DropDown2" bind="cfc:BinFcns.Method({DropDown1})" /> 
</cfform>
</body> 
</html>

这个是.cfc,'BinFcns.cfc'

<cfcomponent output="true">
   <!--- set function name --->
   <cffunction name="Method" access="remote" returnType="array">
    <!--- this is what you passed to the CFC via the {} think in the select --->
      <cfargument name="Selected" type="numeric" required="true">
      <!--- Define array to produce the drop down --->
      <cfset var data="">
      <cfset var result=ArrayNew(2)>
      <cfset var i=0>
      <!--- Get data --->
      <cfquery name="data" datasource="info">
      SELECT *
      FROM info
      Order by cities
      </cfquery> 
      <!--- Convert results to array --->
      <cfloop index="i" from="1" to="#data.RecordCount#">
             <cfset result[i][1]=data.DropDownID[i]>
             <cfset result[i][2]='#DropDownTEXT#'>      
             <!--- determine which is selected via what you passed and something in the database --->
            <cfif data.DropDownID[i] eq #Selected#>
                <cfset result[i][3]=true>
            </cfif>
      </cfloop>

      <!--- And return it --->
      <cfreturn result>
   </cffunction>
</cfcomponent>     
4

5 回答 5

1

你的 CFC 它并不复杂,相信我会学习它的最佳选择,我没有测试过这段代码,但它应该接近工作了.. 就像我的大多数代码一样丑陋。

<cfcomponent output="false">
   <!--- set function name --->
   <cffunction name="Method" access="public" returnType="array">
    <!--- this is what you passed to the CFC via the {} think in the select --->
      <cfargument name="Selected" type="numeric" required="true">
      <!--- Define array to produce the drop down --->
      <cfset var data="">
      <cfset var result=ArrayNew(2)>
      <cfset var i=0>
      <!--- Get data --->
      <cfquery name="data" datasource="#THIS.dsn#">
      SELECT *
      FROM 2ndDropDownData
      Order by DataName
      </cfquery> 
      <!--- Convert results to array --->
      <cfloop index="i" from="1" to="#data.RecordCount#">
             <cfset result[i][1]=data.DropDownID[i]>
             <cfset result[i][2]='#DropDownTEXT#'>      
             <!--- determine which is selected via what you passed and something in the database --->
            <cfif data.DropDownID[i] eq #Selected#>
                <cfset result[i][3]=true>
            </cfif>
      </cfloop>

      <!--- And return it --->
      <cfreturn result>
   </cffunction>
</cffunction>      

CFM 简单!

一个名为 DropDown1 的下拉菜单,然后通过以下代码将其传递给 cfc 以获取下拉菜单 2

<cfselect name="DropDown2" bind="cfc:cfcname.Method({DropDown1})" /> 

就这么简单……两个下拉菜单,第二个叫CFC……值得学习。

如果需要,您可以在 2 日使用 Bindonload 进行预选。

无论如何,希望不要让你害怕氟氯化碳。它们非常有用。

于 2012-11-16T19:59:14.850 回答
0

在您的页面顶部,您可以编写一个cfquery会访问您的数据库并检索数据的内容。然后在页面内,您可以使用cfselect带有查询属性的标签,这应该使用从您的cfquery.

这将允许您快速生成页面,但它不是很可重用,通常被认为是不好的做法。我倾向于远离任何cfselect,cfform等标签。我还将 my 添加cfquery到一个中央 .cfc 文件中,以便可以在整个站点中访问它们。这将在查询更改时节省您的时间,并且您正在整个站点中寻找您进行特定呼叫的位置。

无论如何,希望这会有所帮助,如果您有任何问题,请立即开火!

- -编辑 - -

回应您更新的问题。您的页面上可以有两个cfquery标签。一个会在页面的第一次加载时触发并填充省份列表。选择后,这将提交一个表单并设置一个 URL 变量。然后,您可以将该变量传递给您的第二个变量cfquery,然后填充城市列表。我上面的用户提供的代码示例将在这方面起作用。

再次希望这会有所帮助,如果您想要特定的代码,我可以提供它,但该逻辑应该让您走上正确的道路。

于 2012-11-16T15:00:24.393 回答
0

我相信有些人会惊恐地尖叫,但如果你想要动态选择,这是我作为新手曾经做过的事情。

查询表,获取值

<cfquery datasource="xy" name="get">
 Select *
 From Data
</cfquery>

只需将输出粘贴在选择中,如果您想自大,请使用 CFIF 来确定您正在查看的位。你不需要用CFSELECT,select就可以了。

<cfselect name="select">
  <cfoutput query="get">
    <option value="#URLTAKENFROMDATABASE#"
    <cfif #CGI.SCRIPT_NAME# eq '#URLTAKENFROMDATABASE#'>selected</cfif>
     >#LINKNAME#</option
  </cfoutput>
</cfselect>

您可以将您的查询或输出分组以粘贴在下拉列表中的子标题中,例如

<cfoutput query"get" group="SECTIONA">
  <option value="">#SECTIONA#</option>
      <cfoutput>
        <option value="#URLTAKENFROMDATABASE#"
        <cfif #CGI.SCRIPT_NAME# eq '#URLTAKENFROMDATABASE#'>selected</cfif>
         >#LINKNAME#</option
      </cfoutput>   
</cfouput>
于 2012-11-16T17:15:08.900 回答
0

我通常只是用 jQuery 编写自己的 AJAX 调用,所以我对 ColdFusion 的数据绑定不太熟悉。CFC / NOT CFC 概念实际上是相同的。您正在从服务器请求数据,如果您使用 .cfm 文件或 .cfc 来返回数据,您的代码将非常相似。

CFSelect Docs,返回必须是:

  • 一个二维数组,其中每个数组行中的第一个元素是选项值,行中的第二个元素是要在选项列表中显示的文本。
  • 如果绑定指定 CFC 函数、查询,或者,如果绑定指定 URL,则为查询的 JSON 表示。查询必须包括名称为 cfselect 标记值和显示属性值的列。尽管您可以返回其他列,但您不能在客户端代码中使用它们。调用 CFC 函数时,不必自己将查询转换为 JSON 格式;ColdFusion 会自动进行转换。要使用这种格式,您必须指定一个值属性。如果省略 display 属性,则查询中必须只有一个包含值的列;这些值也用作显示的文本。

绑定数据到表单字段

使用绑定表达式要指定绑定表达式,请使用以下格式之一:

  • cfc:componentPath.functionName(parameters)注意:组件路径不能使用映射。componentPath 值必须是来自 Web 根目录或包含当前页面的目录的点分隔路径。
  • javascript:functionName(参数)
  • 网址:网址?参数
  • URL?参数
  • 包含一个或多个 {bind parameter} 实例的字符串,例如 {firstname}.{lastname}@{domain}
于 2012-11-16T11:43:52.027 回答
0

首先,您可以将第一个下拉列表绑定到 cfc 或从页面上的查询中填充,但不能同时使用两者。任何一种方法都可以,选择一个。

接下来,您Method的 cfc 中的函数有一个参数,但没有正确使用它。您cfquery应该在where子句中使用它。另外,不要尝试预先选择任何城市。在级联选择的上下文中没有意义。

于 2012-11-17T23:18:27.820 回答