CFScript switch语句在传递字符串时抛出错误?

时间:2010-09-10 20:34:48

标签: coldfusion switch-statement

更新

谢谢Ben,我决定将URL复制到另一个结构并使用StructUpdate()修改它。这是代码,如果有人感兴趣(特定于我的应用程序,但您可以编辑带有注释的行以获得有用的功能)。

function rebuildURL(key, value)
{
 var URLstring = "";
 var VarCount = 0;
 var tmpURL = duplicate(URL);
 var VarSeparator = "";
 structUpdate(tmpURL, arguments.key, arguments.value);
 for (key in tmpURL)
 {
  if (tmpURL[key] neq "" and tmpURL[key] neq "10000" and tmpURL[key] neq "1") `<!--- remove the tmpURL[key] neq "10000" and "1"--->`
  {
   if (VarCount neq 0)
   {
    VarSeparator = "&";
   }
   else
   {
    VarSeparator = "";
   }
   URLstring = URLstring & VarSeparator & "#Lcase(key)#" & "=#Lcase(tmpURL[key])#";
   VarCount = VarCount + 1;
  }

 }
 structClear(tmpURL); `<!---not sure if this is necessary, but probably can't hurt unless you are processing thousands of links --->`
 return(URLstring);
}

再次感谢! 斯科特


嘿伙计们,

我正在编写一个自定义函数来重写我页面中链接的URL,我收到以下错误:

无法将复杂对象类型转换为简单值。

表达式已请求变量或中间表达式结果作为简单值,但是,结果无法转换为简单值。简单值是字符串,数字,布尔值和日期/时间值。查询,数组和COM对象是复杂值的示例。 导致错误的最可能原因是您尝试将复杂值用作简单值。例如,您可能尝试在cfif标记中使用查询变量。

错误发生在C:\ ColdFusion8 \ wwwroot \ pascalnew \ turbos.cfm:第8行 从C:\ ColdFusion8 \ wwwroot \ pascalnew \ turbos.cfm调用:第108行 从C:\ ColdFusion8 \ wwwroot \ pascalnew \ turbos.cfm调用:第93行 从C:\ ColdFusion8 \ wwwroot \ pascalnew \ turbos.cfm调用:第1行 从C:\ ColdFusion8 \ wwwroot \ pascalnew \ turbos.cfm调用:第1行

6 :  URLvar = "#URL#";
7 :  switch(param)
8 :  {
9 :   case 'mfr':
10 :   {

这是我的功能代码:

<cfscript>
function SetURL(param, paramval)
{
 URLvar = "#URL#";
 switch(param)
 {
  case 'mfr':
  {
   IF (URLvar contains "mfr") 
   {
    REReplaceNoCase(URLvar, "mfr=^[^\&]", "mfr=#paramval#", "All");
   }
   break;
  }
 }
 return(URLvar);
}
</cfscript>

以下是我测试它的内容:

<cfset urlvar = SetUrl("mfr", "edwards")>
<cfdump var="#urlvar#">

“mfr”如何成为复变量?

谢谢, 斯科特

1 个答案:

答案 0 :(得分:1)

使用CFScript时,某些版本会将块的开头报告为带错误的行。

为URLVar分配“#URL#”时,您将创建指向URL范围的指针。然后,您尝试在其上使用包含运算符。但是,Contains仅比较两个简单值。

因此,您尝试将复杂值作为标量引用实际上来了:

IF (URLvar contains "mfr") 
{
    REReplaceNoCase(URLvar, "mfr=^[^\&]", "mfr=#paramval#", "All");
}

猜测,您正在尝试查看URL本身,而不是URL范围。您可以从CGI范围的某些部分进行汇编,包括SERVER_NAME,SCRIPT_NAME和QUERY_STRING(或者您可以查看所需的单个部分)。

已添加:如果你想知道是否在网址中传递了一个变量,我认为你是在思考这个问题。假设你有一个param和一个paramval来替换它。你可以这样做:

function paramReplace(param, paramVal, scope)
{
    if(structkeyexists(arguments.scope, arguments.param))
    {
        arguments.scope[arguments.param] = arguments.paramVal;
    }
}
paramReplace("mfr", "fred", URL);

这只是使用structKeyExists来确定该变量是否存在于适当的范围内,然后替换该值(如果存在)。如果需要重建实际的查询字符串,可以稍后再执行。如果您的查询字符串包含类似“zone = mfr”的内容,则可以避免出现错误数据的情况。

我没有对此进行测试 - 它不在袖口 - 因此可能需要调整,但它应该让你开始。