通过ajax使用ColdFusion进行大表单处理

通过ajax使用ColdFusion进行大表单处理,ajax,coldfusion,coldfusion-2016,Ajax,Coldfusion,Coldfusion 2016,我经常使用Ajax(Jquery)发送表单,以便在ColdFusion中进行处理。我将表单发送给CFC,CFC通过Ajax通知将结果和错误返回给用户 表单可能相当大(考虑带有额外输入的完整HTML页面),并且需要CFC中的大量逻辑才能正确处理,具体取决于表单中选择的选项 因为CFC中的每个函数都可能很大(可能有1200行代码),所以我从ColdFusion中得到了可怕的“分支目标偏移量过大,简称”错误。为了解决这个问题,我将一些代码放入了一个.cfm文件中,并使用将代码返回到cfc中,这“解决”

我经常使用Ajax(Jquery)发送表单,以便在ColdFusion中进行处理。我将表单发送给CFC,CFC通过Ajax通知将结果和错误返回给用户

表单可能相当大(考虑带有额外输入的完整HTML页面),并且需要CFC中的大量逻辑才能正确处理,具体取决于表单中选择的选项

因为CFC中的每个函数都可能很大(可能有1200行代码),所以我从ColdFusion中得到了可怕的“分支目标偏移量过大,简称”错误。为了解决这个问题,我将一些代码放入了一个.cfm文件中,并使用
将代码返回到cfc中,这“解决”了这个问题,但当试图组织所有与特定cfc相关的小片段时,我感到很困惑。这也可能是一种低效的工作方式

我想知道其他ColdFusion用户是如何使用CFC构造/处理表单的,CFC在将表单数据导入数据库时会做很多额外的工作

我想到的一些选择是:

  • 为创建、更新、读取和删除没有太多代码的操作创建“shell”函数
  • 在shell函数中,
    cf包含许多其他.cfm文件中按子函数列出的所有代码段,以将代码保持在最低限度
  • 或者调用执行子函数的其他CFC,并将表单变量作为参数传递给它们
上述选项最终将使我拥有这样的结构(我不喜欢):


我最终会为每个函数创建一个新的CFC,而不是它们本身就是类/对象。它们可以是CFM文件(并使用
但这样做似乎很明智。有没有其他人知道的替代/更好/标准的方法?

大块
cfif/cfelseif/cfif
cfswitch/cfcase
会导致分支偏移错误。在某些情况下,我们通过将它们移动到单个
cfif
语句来解决这个问题。这很严重减少代码中的分支数量

中断:

<cfif ListFindNoCase("myString", trim(arguments.event_key)) GT 0>
   <!--- myString code --->
<cfelseif ListFindNoCase("myOtherString", trim(arguments.event_key)) GT 0>
   <!--- myOtherString code --->
</cfif>

汇编:

<cfif ListFindNoCase("myString", trim(arguments.event_key)) GT 0>
   <!--- myString code --->
</cfif>
<cfif ListFindNoCase("myOtherString", trim(arguments.event_key)) GT 0>
   <!--- myOtherString code --->
</cfif>

您可以将这些条件检查移动到单独的函数,特别是如果您最终只是设置单个变量的值

如果您处于绑定状态,只需将代码移动到include,然后将其分解。单个函数中的1200行代码不算什么。我的上一次gig中的CFC只是成堆的include,扩展了成堆的其他CFC,每个include可以包含20-30k行代码,其中的函数也包含include。include在这种情况下,函数通常用于专门解决分支偏移问题


FWIW,我的墙上有一个深子对象元数据转储的打印件,作为抽象艺术。

大块的
cfif/cfelseif/cfif
cfswitch/cfcase
会导致分支偏移错误。我们在某些情况下通过将它们移动到单个
cfif
语句来修复此问题。这严重减少了br的数量固定在代码中

中断:

<cfif ListFindNoCase("myString", trim(arguments.event_key)) GT 0>
   <!--- myString code --->
<cfelseif ListFindNoCase("myOtherString", trim(arguments.event_key)) GT 0>
   <!--- myOtherString code --->
</cfif>

汇编:

<cfif ListFindNoCase("myString", trim(arguments.event_key)) GT 0>
   <!--- myString code --->
</cfif>
<cfif ListFindNoCase("myOtherString", trim(arguments.event_key)) GT 0>
   <!--- myOtherString code --->
</cfif>

您可以将这些条件检查移动到单独的函数,特别是如果您最终只是设置单个变量的值

如果您处于绑定状态,只需将代码移动到include,然后将其分解。单个函数中的1200行代码不算什么。我的上一次gig中的CFC只是成堆的include,扩展了成堆的其他CFC,每个include可以包含20-30k行代码,其中的函数也包含include。include在这种情况下,函数通常用于专门解决分支偏移问题


FWIW,我的墙上有一个深子对象元数据转储的打印件,作为抽象艺术。

你使用的是什么版本的ColdFusion?也是基于这篇文章:如果
s或循环,你可能会有太多的
,Java正在疯狂地使用它。你在使用事务吗?我看到了大量的
cftransaction
创建它们问题。@JamesAMohler使用ColdFusion 2016 Enterprise。有很多cfif标记,但我无法进一步降低它们。我尝试减少它们,并删除
标记,但没有效果。唯一的方法是将代码虹吸到.cfm文件中,然后使用
在CFC中重新构建它们。这让我想到了这一点可能是一种更好的/modular/oop方法。我不这样使用ajax或cfc。但是,通常认为是一种好的编程实践,函数只应该做一件事。如果您的函数长度超过1000行,您可能不会遵循这种实践。您使用的是什么版本的ColdFusion?Also基于本文:你可能有太多的
if
s或循环,而Java正在疯狂地使用它。你在使用事务吗?我已经看到大量的
cftransaction
造成了这个问题。@JamesAMohler使用ColdFusion 2016 Enterprise。有很多cfif标记,但我无法进一步降低它们。我试着减少它们,一个nd删除
标记,但它不起作用。唯一的方法是将代码虹吸到.cfm文件中,然后使用
在CFC中重新构建它们。这让我想到可能有更好的/modular/oop方法来实现这一点。我不使用ajax或CFC的这种方法。然而,通常认为是一种好的方法编程实践是函数应该只做一件事。如果你有超过1000行的函数,你可能不会遵循这种做法。我相信你意识到这两个代码示例在逻辑上并不等同。@DanBracuk大多数应用程序都不符合逻辑。:)这很有趣,我来试试。你知道这两个代码吗