0

如果有更好的方法来解决这个问题(这很可能),请让我知道如何去做。

我正在编写一些代码,这些代码应该动态地将表单变量设置为常规变量,这样我们就可以变得懒惰,而不必使用 form.somevariable 名称来引用变量。

那部分工作得很好。直到我开始测试 URL 变量具有相同名称的 URL 冲突。例如。. .

我有一个传递两个变量的表单;名字和姓氏。如果我点击页面,表单就会出现,我输入名字和姓氏,然后单击提交。该代码完美运行。

但是,如果我有同名的 URL 变量,则代码会报告 url 变量值而不是表单值。

一些样本值;

url.FirstName = 乔

url.LastName = 黑色

form.FirstName = 史蒂夫

form.LastName = 白色

我公开表单变量的代码将正确找到表单字段名称,但是当我“评估”给定表单字段的值时,它将返回同名 URL 变量的值,而不是表单变量。

我真正想要的(正如我在上面简要描述的)是让代码自动将客户端、URL 和表单变量转换为“常规变量”,这样您以后就不必编写大量额外的代码来获取它们。CFWHEELS 和 ColdBox 等框架默认执行此操作,但在我工作的公司,我们没有使用其中任何一个。我需要它来公开 URL 变量,但如果它们具有相同的名称,则将它们作为主变量,因为它们可能旨在进行更新等。

代码如下 如果您愿意,请随意忽略 URL 和客户端变量的代码,因为它们不会直接影响表单代码的工作方式,我已经将它们注释掉了,我得到了相同的结果。我提供所有这些是为了更完整地了解我到目前为止一直在玩什么。请注意,我通常不使用“评估”。可能有更好的方法,但我不知道它是什么。

++++++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++++++

名字 姓氏


网址变量:

<cfloop index="i" list="#paramsurl#">

    <cfset myDynVar = Evaluate(i)>



    <!--- Let's output the dynamically created variable as a test --->

    #i# = #myDynVar#<br />

</cfloop>

<cfoutput>

    <b>Field Names:</b> #Form.FieldNames#

    <p>

        <b>Field Values:</b><br>

        <cfloop INDEX="TheField" list="#Form.FieldNames#">

            #TheField# = #Evaluate(TheField)#<br>

            <cfset TheField = Evaluate(TheField)>

        </cfloop>

    </p>

    Lets try and output the two form fields without using the "form." notation<br>

    FirstName : #FirstName# <br />

    LastName : #LastName#

</cfoutput>


当前可用的客户端变量有:

<cfset nVarCounter = 1>

<cfloop list="#GetClientVariablesList()#" index="whichClientVar">

    #whichClientVar# : #client[whichClientVar]#<br />

    <cfset whichClientVar = Evaluate(whichClientVar)>

</cfloop>

4

5 回答 5

4

您应该始终确定变量的范围。当您使用评估时,它会遍历范围顺序url,并在到达范围之前将值拉出form范围

您可以使用关联数组表示法来提取数据(如下所示)。

<cfoutput>
<b>Field Names:</b> #Form.FieldNames#
<p>
    <b>Field Values:</b><br>
    <cfloop INDEX="TheField" list="#Form.FieldNames#">
        #TheField# = #form[TheField]#<br><!--- specify form scope --->
        <cfset myField = structKeyExists(url,TheField) ? url.TheField : form.TheField>        
    </cfloop>
</p>
</cfoutput>
于 2013-10-09T20:46:47.673 回答
2

您可以使用structAppend()form将范围和url范围中的值“复制”到范围中。variables

structAppend( variables, form, true );
structAppend( variables, url, false );

在第一行,表单作用域的任何元素都被复制到变量作用域,如果变量作用域中已经存在同名的变量,它将用表单作用域中的值覆盖该值。

在第二行中,来自 URL 范围的元素被复制到变量范围,但如果变量范围中已经存在变量,则不会被覆盖。

您可以对任何范围和任何其他 ColdFusion 结构执行此操作。您还可以对它们重新排序,以便一个范围优先于其他范围。

于 2013-10-10T02:18:34.557 回答
0

在 CF 10 或 Railo 4 中,您可以使用Underscore.cfc 库defaults()的功能来简洁地完成您想要做的事情。例子:

// instantiate Underscore library
_ = new Underscore();

// copy values from form and url scopes into the variables scope
_.defaults(variables, form, url);

此函数将第一个结构中的任何未定义值“填充”到后续结构中的值中。它从左到右工作,因此在此示例中,它优先于 inform中的值url

免责声明:我编写了 Underscore.cfc 库。

于 2013-10-10T07:46:44.133 回答
-1

请参阅以下 Adob​​e 文档了解优先顺序: http: //help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec09af4-7fdf.html

如果您出于某种原因想要反转此优先级,您应该能够将所有 FORM 字段设置为变量范围......

也许像...

<cfloop collection=#form# item="varName">
  <cfset SetVariable("variables.#varName#", evaluate("FORM." & varName))>
</cfloop>
于 2013-10-09T23:00:33.547 回答
-2

感谢所有伟大的想法。

以下是我最终的结果。

<cfset scopes = "url,client,form">

<cfloop list="#scopes#" index="i">
    <cfloop list="#structKeyList( evaluate( i ) )#" index="j">
            <cfset structInsert( VARIABLES, j, evaluate( i & '["' & j & '"]' ), true ) />
    </cfloop>
</cfloop>


<cfoutput>
    Lets try and output the two form fields without using the "form." notation and make sure that the URL variables are NOT over writing the Form ones<br>
    FirstName : #FirstName# <br />
    LastName : #LastName#<br />

</cfoutput>


<cfdump var="#VARIABLES#" abort="1" label="Combined Variables Scope stuff" />
于 2013-10-10T16:32:37.683 回答