2011-02-28 36 views
1

我創建了一個簡單的自定義標籤,它接受一個字符串,用「 - 」和「&」用「和」替換查詢字符串(我不需要%20等)。使用ColdFusion自定義標籤的奇怪結果

不管怎麼說,它工作得很好,但是我的自定義標籤本身之前創造一個空間,像這樣:

qsEncode.cfm:(自定義標籤)

<cfparam name="attributes.string" type="string" default=""> 

<cfset whitespace = Replace(attributes.string," ","-","all")> 
<cfset ampersand = Replace(whitespace,"&","and","all")> 

<cfoutput>#ampersand#</cfoutput> 

標籤的實現:

<a href="?Page=<cf_qsEncode string="#getCategory.Name#">">#getCategory.Name#</a> 

,哪個是標籤前創建一個空間的最終輸出:

somepage.cfm?Page=%20Finance-and-Taxes 

我的自定義標籤沒有被傳遞已空格前面加上它(即使它是會被替換爲「 - 」字符)的字符串,所以我不明白爲什麼標籤創建空白。

注意:我知道我可以在我的自定義標籤中包含?Page=來修復它,但我仍然好奇爲什麼會發生這種情況。

+0

是輸入字符串的「%20」部分嗎?如果是,並且你期望它被replace()替換爲「」,那麼你錯了; 「%20」仍然是字符串「%20」,除非你'urlDecode()'它(或者,如果它實際上是在一個查詢參數,然後它會自動在URL範圍被暴露之前解碼)。 – 2011-02-28 20:35:27

+0

@Adam,不,%20不是輸入字符串的一部分。 – 2011-02-28 21:15:36

回答

6

你有額外的空間,具體的問題可能可以固定使用:

<cfsetting enablecfoutputonly="true"> 

的第一件事您的自定義標籤內(並設置回「假」結尾)。

然而,我會強烈建議與實際的功能替換定製標記的功能性 - 一個CFC內內聯,或者(優選地)。無論哪種方式,你想是這樣的:

<cffunction name="qsEncode" output="false" returntype="string"> 
    <cfargument name="str" type="string" required="true"> 
    <cfset var whitespace = Replace(arguments.str," ","-","all")> 
    <cfset var ampersand = Replace(whitespace,"&","and","all")> 
    <cfreturn ampersand> 
</cffunction> 

然後你必須:

<a href="?Page=#qsEncode(getCategory.Name)#">#getCategory.Name#</a> 

像這些不維護狀態的實用功能,一個快速解決方案(撇開論據,單身智慧)是建立一個實用的cfc,並將其作爲單例存儲在應用範圍中。在onApplicationStart處理您的Application.cfc的實例化utility.cfc。然後,在整個應用程序,你可以做這樣的事情:

application.utility.qsEncode('this'); 
application.utility.someOtherFunction('that'); 
application.utility.yetAnotherStringMangler('theother');  
+0

謝謝你的詳細解決方案 – 2011-02-28 20:51:39

+0

@Ken,你能告訴我如何在'Application.cfc'中實例化函數嗎? – 2011-02-28 21:29:07

+0

@Nick,在Application.cfc中你應該有一個'onApplicationStart'函數。它會在您啓動應用程序時運行(或手動觸發該功能)。在那裏,你會有'application.utility = createobject('component','utility')'。如果您需要詳細的幫助,請查看CF文檔,其他SO答案 - 或者在此提出另一個問題。 – 2011-02-28 21:45:50

0

Ken是正確的 - 在你的自定義標籤CFM白色空間創造額外的空間,它的輸出。我推薦他的回答(我更喜歡通過自定義標記CFMs調用UDF函數......甚至更好地作爲CFC對象中的函數在CFM上)。

但是,如果你想簡單地調整現有的自定義標籤,使用CFSILENT扼殺空白輸出(和文件中最後一個標記後,確保沒有尾隨空白)。

<cfsilent> 
<cfparam name="attributes.string" type="string" default=""> 

<cfset whitespace = Replace(attributes.string," ","-","all")> 
<cfset ampersand = Replace(whitespace,"&","and","all")> 

</cfsilent><cfoutput>#ampersand#</cfoutput>