我有一系列的表行如下:
<cfloop query="qryPlayer">
(...snip...)
<input data-playerid="#PlayerID#" name="PlayerSort" value="#PlayerSort#">
(...snip...)
</cfloop>
在表单底部,我有一个字段:
<input type="hidden" name="PlayerIDs"> <!--- Populated by js --->
每当用户更改任何行中的值时,我会使用与需要更新的字段关联的主键列表填充PlayerID:
$('input[name=PlayerSort]').change(function() {
$('input[name=Save]').show();
var arrPlayerID = [];
$('input[name=PlayerSort]').each(function() {
if ($(this).val()) {
arrPlayerID.push($(this).data('playerid'));
}
});
$('input[name=PlayerIDs]').val(arrPlayerID.join(','));
});
然后,当用户按下“保存”按钮时,我会更新其中包含值的所有字段。
问:这对我来说是正确的吗?它有效,但是我忘记了处理表单提交的一些基本方法吗? 顺便说一下,客户并不希望它被AJAX化,因为他想让用户能够按下重置并重新开始。因此,输入一组值,单击“保存”,让ColdFusion更新与form.PlayerIDs关联的所有PlayerSort值。<cfloop list="#form.PlayerIDs#" index="local.PlayerID">
<cfset local.Index = local.Index + 1>
UPDATE dbo.Player SET
PlayerSort = <cfqueryparam cfsqltype="cf_sql_integer" value="#ListGetAt(form.PlayerSort,local.Index)#">
WHERE PlayerID = <cfqueryparam cfsqltype="cf_sql_integer" value="#local.PlayerID#">;
</cfloop>
答案 0 :(得分:1)
我认为你的方法很好。但是,它可以在没有JavaScript的情况下完成,这会减少和简化您的代码,并确保它能够解决用户禁用JavaScript的奇怪机会。
将此用作表单代码:
<cfloop query="qryPlayer">
(...snip...)
<input name="PlayerSort_#PlayerID#" value="#PlayerSort#">
(...snip...)
</cfloop>
然后你的行动代码将是:
<cfloop collection="#Form#" item="field">
<cfif ListLen(field,"_") IS 2 AND ListFirst(field,"_") IS "PlayerSort">
<cfquery datasource="YourDatasource">
UPDATE dbo.Player
SET PlayerSort = <cfqueryparam cfsqltype="cf_sql_integer" value="#Form[field]#">
WHERE PlayerID = <cfqueryparam cfsqltype="cf_sql_integer" value="#ListLast(field,'_')#">
</cfquery>
</cfif>
</cfloop>