我创建了一个简单的自定义标记,它接受一个字符串,用“ - ”和“&”替换空格用“和”作为查询字符串(我不想要%20等)。
无论如何,它工作正常,但我的自定义标签正在创建一个空格,如下所示:
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
我的自定义标记没有被传递给前面有空格的字符串(即使它被“ - ”字符替换)所以我不明白标记为什么会创建空格。< / p>
注意:我确实知道我可以在我的自定义标记中添加?Page=
来修复它,但我仍然很好奇为什么会这样。
答案 0 :(得分:6)
使用以下方法可能会修复额外空间的具体问题:
<cfsetting enablecfoutputonly="true">
作为自定义标记内的第一个内容(并在结尾处将其设置为“false”)。
但是,我强烈建议使用实际功能替换自定义标签的功能 - 内联或(最好)在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,并将其作为单例存储在应用程序范围中。在utility.cfc
的{{1}}处理程序中实例化onApplicationStart
。然后,在整个应用程序中,您可以执行以下操作:
Application.cfc
答案 1 :(得分:0)
Ken是正确的 - 自定义标签CFM中的空白区域在其输出中创建了额外的空间。我推荐他的答案(我更喜欢在自定义标签CFM中调用UDF函数......作为CFM中CFC对象中的函数更好)。
但是,如果您只想调整现有的自定义标记,请使用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>