测试ColdFusion中是否存在FORM范围/结构

时间:2009-07-30 13:40:26

标签: coldfusion railo application.cfc

问题:为WSDL请求CFC时,出现以下错误:变量形式未定义。它发生在这行代码中,位于application.cfc

中的OnRequestStart方法中
<cfif structKeyExists(form,'resetappvars')>
    <cfset OnApplicationStart() />
</cfif>

如果我要求特定方法,它可以正常工作。我已经考虑过使用cfparam创建一个默认的表单结构,如果不存在,但这看起来像一个丑陋的黑客,我担心它实际上会在CFC的变量或这个范围内创建表单结构。也许这也是一个合法的错误?

注意:这只发生在我请求WSDL时,如果我直接调用一个方法 - 代码按预期执行而没有问题。

更新: Application.cfc代码示例 - 只需将任何CFC添加到您的应用中,然后通过?wsdl请求它以查看问题。这已经在ColdFusion 7和ColdFusion 8上测试过(并且失败了)。

<cfcomponent output="false">

    <cffunction name="OnApplicationStart" access="public" returntype="boolean" output="false" hint="Fires when the application is first created.">
        <cfset application.dsn = "my_dsn" />
        <cfreturn true />
    </cffunction>

    <cffunction name="OnRequestStart" access="public" returntype="boolean" output="false" hint="Fires at first part of page processing.">
        <cfargument name="TargetPage" type="string" required="true" />
        <cfif structKeyExists(form,'resetappvars')>
            <cfset OnApplicationStart() />
        </cfif>
        <cfreturn true />
    </cffunction>
</cfcomponent>

5 个答案:

答案 0 :(得分:8)

也许尝试添加:

 <cfif IsDefined("form")>...</cfif>

围绕上面的代码?

答案 1 :(得分:4)

你也可以cfparam你正在寻找的变量然后只需稍微改变你的逻辑(假设resetAppVars是一个布尔值:

<cfparam name="form.resetAppVars" default="false" />
...
<cfif form.resetAppVars>
  <cfset OnApplicationStart() />
</cfif>

编辑:我不确定上面的代码是否可以被视为黑客,但对我来说它似乎是非常标准的CF.

答案 2 :(得分:3)

post of Ben Nadel提供了可用于不同类型请求的范围的详细列表。

通过阅读它,您可以很容易地发现表单范围在给定的上下文中不可用,但 url 是。

答案 3 :(得分:2)

我听说这只是一个意见问题,但在我看来,在CFC中引用您的表单范围是不恰当的,因为无法保证在调用cfc时表单范围可用并且当你的方法被调用时。最好确保明确向对象提供方法可用的任何数据。这可以通过包含一个参数来完成:

<cfargument name="resetAppVars" type="boolean" required="false" default="false" />

然后检查arguments.resetAppVars,它总是被定义,但是默认为false。

或者通过在对象上创建属性并创建显式set方法:

(在您的cfc顶部)

<cfset this.resetAppVars = false />


<cffunction name="setResetAppVars" access="public" returnType="void" output="false">
   <cfargument name="flagValue" type="boolean" required="true" />

   <cfset this.resetAppVars = arguments.flagValue />
</cffunction>

在这种情况下,您将检查this.resetAppVars。您还可以使用<cfset var resetAppVars = false />作为声明在本地对此进行范围调整,这使其成为对象的私有属性,并且可能是正确的,因此调用该对象的代码不能使用非布尔类型不正确地覆盖此变量。在这种情况下,您只需在测试中直接引用resetAppvars,而不是使用此范围。

答案 4 :(得分:1)

你也可以这样做:

<cfif NOT isSoapRequest()>...

并将剩下的逻辑放在那个块中。