更新
谢谢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”如何成为复变量?
谢谢, 斯科特
答案 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”的内容,则可以避免出现错误数据的情况。
我没有对此进行测试 - 它不在袖口 - 因此可能需要调整,但它应该让你开始。