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

时间:2011-02-28 19:25:08

标签: coldfusion

我创建了一个简单的自定义标记,它接受一个字符串,用“ - ”和“&”替换空格用“和”作为查询字符串(我不想要%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=来修复它,但我仍然很好奇为什么会这样。

2 个答案:

答案 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>