使用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=
来修复它,但我仍然好奇为什么会发生这种情况。
你有额外的空间,具体的问题可能可以固定使用:
<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');
谢谢你的详细解决方案 – 2011-02-28 20:51:39
@Ken,你能告诉我如何在'Application.cfc'中实例化函数吗? – 2011-02-28 21:29:07
@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>
是输入字符串的“%20”部分吗?如果是,并且你期望它被replace()替换为“”,那么你错了; “%20”仍然是字符串“%20”,除非你'urlDecode()'它(或者,如果它实际上是在一个查询参数,然后它会自动在URL范围被暴露之前解码)。 – 2011-02-28 20:35:27
@Adam,不,%20不是输入字符串的一部分。 – 2011-02-28 21:15:36