ColdFusion 9中的动态下拉列表

时间:2012-11-16 09:57:07

标签: html coldfusion coldfusion-9 cascadingdropdown

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

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

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

请,没有JavaScript,没有AJAX,没有ColdFusion CFC,没有比一些ColdFusion标签更多或更少... :(逻辑代码应该在一个.cfm文件中。

  • 编辑 -

@Charles Higgins

似乎无法使其发挥作用。它正在抛出“错误调用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>     

5 个答案:

答案 0 :(得分: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 SIMPLE!

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

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

就是这么简单......两次下降,第二次叫CFC。值得学习。

如果需要,您可以在第二天使用Bindonload进行预选。

无论如何希望能阻止你害怕CFC ......它们非常有用。

答案 1 :(得分:0)

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

来自CFSelect Docs,返回必须是:

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

来自Binding data to form fields

  

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

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

答案 2 :(得分:0)

在页面顶部,您可以编写一个cfquery来查找数据库并检索数据。然后,在页面中,您可以使用cfselect标记及其查询属性,这应该会在选择框中填充从cfquery中提取的值。

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

无论如何,如果您有任何疑问,请希望这会有所帮助!

--- ---编辑

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

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

答案 3 :(得分:0)

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

查询表,获取值

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

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

<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>

答案 4 :(得分:0)

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

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