测试ColdFusion中是否存在表单作用域/结构

测试ColdFusion中是否存在表单作用域/结构,coldfusion,railo,application.cfc,Coldfusion,Railo,Application.cfc,问题:当请求a时,我得到以下错误:变量形式未定义。它发生在application.cfc中的OnRequestStart方法的这一行代码中 <cfif structKeyExists(form,'resetappvars')> <cfset OnApplicationStart() /> </cfif> 也许可以尝试添加一个: <cfif IsDefined("form")>...</cfif> 。。。 围绕上述代码?您

问题:当请求a时,我得到以下错误:变量形式未定义。它发生在application.cfc中的OnRequestStart方法的这一行代码中

<cfif structKeyExists(form,'resetappvars')>
    <cfset OnApplicationStart() />
</cfif>
也许可以尝试添加一个:

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

围绕上述代码?

您也可以
cfparam
查找变量,然后只需稍微更改逻辑(假设resetAppVars是布尔值:

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

...

编辑:我不确定上述代码是否可以被视为黑客行为,但对我来说,这似乎是相当标准的CF。

我听说这只是一个意见问题,但对我来说,在CFC中引用表单范围是不合适的,因为无法保证在调用CFC时以及在调用方法时表单范围可用调用。最好确保将需要用于方法的任何数据显式提供给对象。这可以通过包括参数:

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

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

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

(在您的cfc顶部)


在这种情况下,您将对照this.resetAppVars进行检查。您还可以使用
作为声明在本地对其进行范围限定,这使其成为对象的私有属性,并且可能是正确的,因此调用对象的代码不能用非布尔类型不正确地覆盖此变量。在这种情况下,您只需引用directly来重置测试中的AppVar,而不是使用此作用域。

这给出了可用于不同类型请求的作用域的详细列表


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

您也可以这样做:

<cfif NOT isSoapRequest()>...
。。。

将剩下的逻辑放在这一块中。

如果你不在windows上,你认为你有案例问题吗?即使我有railo的经验,我在案例转换方面也有很多奇怪的问题,必须在一些案例中一起解决。IsDefined(“form.resetappvars”)这是海报所需要的,我想。我通常同意引用CFC中的表单范围是不合适的。然而,在应用程序中,CFCOnReestStEnter方法似乎是一个考虑引用表单范围的合法的地方。注意到,这个错误只发生在我尝试为远程MFC检索一个CFC的WSDL时。方法。在onRequestStart方法中使用isSoapRequest存在一些问题:谢谢你的帖子-但是我怎么知道我收到了一个WSDL请求?解析URL范围?是的…似乎StructKeyExists(URL,“WSDL”)可以是最简单的方法。就个人而言,我在标识方面没有这样的问题,因为使用单独的CFC服务,它们只是扩展了所需的核心组件。它提供了更清晰的项目结构,比如说/api/api.CFC?wsdl在某些方面优于/components/core/model/webServiceLayerManager.CFC?wsdl。
<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>
<cfif NOT isSoapRequest()>...