【问题标题】:CFScript switch statement throws error when passed a string?CFScript switch 语句在传递字符串时抛出错误?
【发布时间】:2010-09-10 20:34:47
【问题描述】:

更新:

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

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”如何是一个复变量??

谢谢, 斯科特

【问题讨论】:

    标签: coldfusion switch-statement


    【解决方案1】:

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

    当您将“#URL#”分配给 URLVar 时,您正在创建一个指向 URL 范围的指针。然后,您尝试对其使用 contains 运算符。但是,包含只比较两个简单的值。

    因此,您尝试将复杂值引用为标量实际上是在这里:

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

    您猜测,您正在尝试查看 URL 本身,而不是 URL 范围。您可以从 CGI 范围的各个部分组装它,包括 SERVER_NAME、SCRIPT_NAME 和 QUERY_STRING(或者您可以查看您需要的单个部分)。

    补充:如果你想知道一个变量是否在url中传递,我认为你想多了。假设您有一个 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”之类的内容,这可以避免您获得错误数据的情况。

    我还没有测试过——它是即兴的——所以它可能需要调整,但它应该能让你开始。

    【讨论】:

    • 啊!我有一种感觉,它可能与 switch() 语句无关。你是对的,我正在尝试修改查询字符串。呃!那么,CGI.QUERY_STRING 是一个简单的变量吗?
    • Ben,你是对的,它确实需要一些调整(if 语句末尾缺少括号),但它有效。现在,我找不到重建 URL 的方法;然后我整个下午都在盯着这个东西,真的很累。
    • 我修复了丢失的括号——谢谢。您需要遍历结构(在本例中为 arguments.scope)。范围是结构体,因此请查看 struct*() 函数,例如 structKeyArray() 和 structCount()。
    • 是的,应该这样做。谢谢。顺便说一句,我不能只使用 StructUpdate() 而不是整个“if (structkeyexists”) 语句吗?
    • 我以前从未使用过那个(也不知道)。不过,看起来它可以正常工作。
    猜你喜欢
    • 2016-07-24
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多