好吧所以人们没有清楚地理解我的问题,所以我删除了其他人已经提出问题的网址,那里我没有得到完美答案..
所以这是问题........
我希望在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>
答案 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
中提取的值。
这将允许您快速生成页面,但它不是非常可重复使用,通常被认为是不好的做法。我倾向于远离任何cfselect
,cfform
等标签。我还将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
子句中使用它。此外,不要试图预先选择任何城市。在级联选择的上下文中没有意义。