2009-07-30 45 views
2

問題:請求WSDLCFC時,出現以下錯誤:變量FORM未定義。它發生在這行代碼,在OnRequestStart方法的Application.cfc在ColdFusion中測試FORM範圍/結構的存在

<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> 
+0

你認爲你有一個案件的問題,如果你不在Windows上,甚至與我的經驗與鐵路我有很多奇怪的問題與案件轉換,不得不在一些下水溝駝峯一起。 – ethyreal 2009-07-30 16:12:55

回答

3

post of Ben Nadel給出了可用於不同類型請求的範圍的詳細列表。

通過閱讀它,你可以很容易地發現,形式範圍在給定的情況下使用,但網址是。

+0

感謝帖子 - 但我怎麼知道我正在得到一個WSDL請求?解析URL範圍? – Goyuix 2010-01-05 15:40:03

8

也許嘗試加入:

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

圍繞上面的代碼?

+1

+1。這是我使用IsDefined()的一次。 – ale 2009-07-30 14:23:42

+1

IsDefined(「form.resetappvars」)是海報想要的,我想。 – Henry 2009-07-30 17:30:00

4

你也可以cfparam你正在尋找那麼就改變你的邏輯有點(假設resetAppVars是一個布爾變量:

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

編輯:我不知道,如果上面的代碼可以考慮一個黑客,但它似乎非常標準的CF,對我來說。

2

我聽說這只是一個意見問題,但在我看來,在CFC中引用表單範圍是不恰當的,因爲沒有保證當調用cfc和調用方法時,表單範圍可用。最好確保任何需要avai的數據標籤提供給你的對象。這可以通過包括一個參數來完成:

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

然後你檢查arguments.resetAppVars,它總是定義,但默認爲false。

或通過創建您的對象上的屬性,並創建一個明確的一套方法:

(您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,而不是使用此範圍。

+0

我通常會同意在CFC內引用表單作用域是不合適的。但是,在application.cfc onRequestStart方法中,它似乎是考慮引用表單範圍的合法位置。另外值得注意的是,這個錯誤只會在我嘗試用遠程方法檢索cfc的WSDL時發生。 – Goyuix 2009-08-27 18:16:39

1

你也可以這樣做:

<cfif NOT isSoapRequest()>... 

,並堅持該區塊內的其餘邏輯。