使用ColdFusion自定义标签的奇怪结果

问题描述:

我创建了一个简单的自定义标签,它接受一个字符串,用“ - ”和“&”用“和”替换查询字符串(我不需要%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

你有额外的空间,具体的问题可能可以固定使用:

<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

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>