9

我使用 ColdFusion 作为我的应用程序服务器和数据库的 SQL Server。我有一个选择表单元素,其中列出了许多车辆:Volvo S60, BMW M6, VW Jetta.

根据用户选择的车辆,我需要我的网页执行数据库查询,以找出他们选择的车辆“类型”,例如 SUV、Coupe、敞篷车。根据从数据库返回的“类型”,数据库将返回适合该车辆类型的选项列表。我的数据库表可以根据车辆下拉列表的值执行此操作,这一切都很好。

现在,我现在想将该车辆“类型”的可用选项列出为一组复选框。这样做应该是遍历数据库结果集并为每一行生成一个复选框的简单案例。

我想在不刷新页面的情况下执行此操作。如何从下拉列表中动态获取值,将此值传递给数据库,取回结果,然后显示相应的复选框?

4

4 回答 4

4

我在之前的评论中提到过,在 ColdFusion 中执行此操作的最简单方法是将表单元素绑定到 cfc 方法。谷歌搜索“cfinput bind”会导致很多例子,但由于我被要求提供答案,我将展示一个我曾经写过的例子。这不完全是 OP 想要的,但它显示了总体思路。它将根据另一个文本框的值填充一个文本框。

请注意,cfc 和 cfm 文件必须位于同一目录中。

.cfm 文件

<!--- When you type a clinic code here: ---->
<div id="clinicCodeInput" class="hidden">
Clinic Code <input name="clinicCode" type="text" />
</div>

<!---- A query result will appear here ---->
<div id="clinicNameFromPatientSatisfaction" class="hidden">
Patient Satisfaction Name <cfinput type="text" 
name="NameOfClinic" 
bind="cfc:PatientSatisfactionClinics.GetClinicName({clinicCode})" 
bindonload="no"> 
</div>

.cfc 文件

<cffunction name="GetClinicName" access="remote" returntype="string">
<cfargument name="clinicCode" type="string" required="yes">
<cfscript>
var clinicName = QueryNew("a");
var returnString = "No Record for Clinic Code " & arguments.clinicCode & ".";
var clinicCodeAsInt = 0;

if (isNumeric(arguments.clinicCode) 
and round(arguments.clinicCode) is arguments.clinicCode)
clinicCodeAsInt = arguments.clinicCode;
</cfscript>

<cfif clinicCodeAsInt gt 0>
<cfquery name="clinicName" datasource="dw">
select name
from patient_satisfaction_clinic
where clinic_code = 
<cfqueryparam cfsqltype="cf_sql_integer" value="#clinicCodeAsInt#">
</cfquery>

<cfif clinicName.recordcount gt 0>
<cfset returnString = clinicName.name[1]>
</cfif>
</cfif>  <!--- clinicCodeAsInt gt 0 --->

<cfreturn returnString>

</cffunction>
于 2012-12-26T13:23:11.640 回答
3

Adobe ColdFusion 文档中<cfajaxproxy>有一个您需要做什么的示例,该文档演示了必要的技术。这并不完全符合您的要求,但只需将标记从纯文本更改为复选框以满足您的要求。这里代码太多,无法复现,但关键是你用来<cfajaxproxy>在客户端的JS和服务器端的CFC之间建立一个代理,使JS能够从服务器检索数据。

使用<cfajaxproxy>不需要滚动您自己的 JS AJAX 处理,或使用 JQuery(等)来这样做。也就是说,手工操作并不太难……使用该文档中演示的技术将 CF 与前端代码完全分离就很容易了(有一个很好的例子,不使用 CF 来做客户端) -side stuff)...这一切都归结为让事件处理程序监听相关事件,然后以某种方式对服务器进行 AJAX 回调以获取数据,然后将其放入<div>或其他东西中。在这种情况下,CF 仅依赖提供代理位:您仍然需要自己做其余的事情。

于 2012-12-26T10:46:09.397 回答
2

好的,这就是我所做的,到目前为止似乎对我有用。但我要回顾一下亚当和丹的好回答。

我在 Vehicle.cfm 页面上创建了一个包含所有表单元素的表单,复选框除外。

我创建了一个名为 vehicleOptions.cfm 的新 CFM 模板,它接受一个参数,运行一个 SQL 查询,然后输出实际的 HTML 以创建复选框。

然后我在 Vehicle.cfm 页面上的表单中转到我希望我的复选框出现的区域并输入: <cfdiv bind="url:cfincludes/vehicleOptions.cfm?VehicleModel={Model}" />

“模型”是我的表单上元素的 ID,它包含用户选择的车辆的值。因此,现在每当用户更改下拉列表中的模型时,该区域每次都会使用不同的复选框进行更新。它真的很棒,我不必写一行 Javascript!

这个解决方案适用于我想要的,但我猜它不是 ColdFusion AJAX 最优雅的用法?正如我所说,我将审查答案并尝试制定更好的解决方案。感谢所有 CF 开发人员的帮助!

于 2012-12-26T22:23:34.530 回答
1

这很简单。每个选项都应该有编码在其中的值,例如

<select>
<option class="car" name="car" value="volvo">Volvo</option>
<option class="car" name="car" value="honda">Honda</option>
<option class="car" name="car" value="ford">Ford</option>
</select>

然后,您使用 jQuery。

$('#go').on('click', function() {
    var car = $('.car:selected').val(); 
    // make ajax call here
});​

这是一个工作示例:http: //jsfiddle.net/Yxmjk/。它不演示 AJAX 调用,但它演示了如何获取包含在 AJAX 调用中的数据。

于 2012-12-25T02:42:48.507 回答