上一页下一页

重复代码块

创建服务器行为时,可以使用循环结构将某个代码块重复指定的次数。循环语法为:

<@ loop (@@参数 1@@,@@参数 2@@,@@参数 3@@,@@参数 n@@) @>
   代码块
<@endloop@>

“loop”指令采用逗号分隔的参数数组列表作为参数。在这种情况下,参数数组参数使用户能够为单个参数提供多个值。重复文本将被拷贝 n 次,其中 n 是参数数组参数的长度。如果指定多个参数数组参数,则所有数组的长度必须相同。在第 i 次循环计算时,参数数组的第 i 个元素将替换代码块中的相关参数实例。

当以后创建服务器行为对话框(请参见为自定义服务器行为创建对话框)时,可以向该对话框添加控件,使页面设计者能够创建参数数组。Dreamweaver 包括一个简单的数组控件,可用于创建对话框。这个称作“文本域逗号分隔列表”的控件可以通过“服务器行为创建器”获得。若要创建更为复杂的用户界面元素,请参见 API 文档,以创建包含控件(例如,网格控件)的对话框来创建数组。

“loop”指令无法嵌套,但是条件指令(请参见条件式代码块)却可以嵌套在“loop”指令中。

下面的示例显示如何使用这样的重复代码块来创建服务器行为(示例为用于访问预存过程的 ColdFusion 行为):

<CFSTOREDPROC procedure="AddNewBook"
   datasource=#MM_connection_DSN# 
   username=#MM_connection_USERNAME# 
   password=#MM_connection_PASSWORD#>
<CFPROCPARAM type="IN" dbvarname="@CategoryId" value="#Form.CategoryID#"
   cfsqltype="CF_SQL_INTEGER">
<CFPROCPARAM type="IN" dbvarname="@ISBN" value="#Form.ISBN#"
   cfsqltype="CF_SQL_VARCHAR">
</CFSTOREDPROC>

在该示例中,CFSTOREDPROC 标签可以包含零个或多个 CFPROCPARAM 标签。但是,如果不支持“loop”指令,则没有办法在插入的 CFSTOREDPROC 标签内包括 CFPROCPARAM 标签。如果在不使用“loop”指令的情况下,将该示例创建为服务器行为,则该示例需要分成两部分:主 CFSTOREDPROC 标签,以及有多个涉及类型的 CFPROCPARAM 标签。

使用“loop”指令可以将相同的过程按如下方式编写:

<CFSTOREDPROC procedure="@@procedure@@"
datasource=#MM_@@conn@@_DSN#
username=#MM_@@conn@@_USERNAME# 
password=#MM_@@conn@@_PASSWORD#>
<@ loop (@@paramName@@,@@value@@,@@type@@) @>
   <CFPROCPARAM type="IN" 
   dbvarname="@@paramName@@"
   value="@@value@@" 
   cfsqltype="@@type@@">
<@endloop@>
</CFSTOREDPROC>

在上述示例以及条件代码块的情况下,@> 后面的换行符将被忽略。

如果用户在“服务器行为”对话框中输入下列参数值:

procedure = "proc1"
conn = "connection1"
paramName = ["@CategoryId", "@Year", "@ISBN"]
value = ["#Form.CategoryId#", "#Form.Year#", "#Form.ISBN#"]
type = ["CF_SQL_INTEGER", "CF_SQL_INTEGER", "CF_SQL_VARCHAR"]

则服务器行为将下列运行时代码插入页面:

<CFSTOREDPROC procedure="proc1"
datasource=#MM_connection1_DSN#
username=#MM_connection1_USERNAME# 
password=#MM_connection1_PASSWORD#>

<CFPROCPARAM type="IN" dbvarname="@CategoryId" value="#Form.CategoryId#"
   cfsqltype="CF_SQL_INTEGER">
<CFPROCPARAM type="IN" dbvarname="@Year" value="#Form.Year#"
   cfsqltype="CF_SQL_INTEGER">
<CFPROCPARAM type="IN" dbvarname="@ISBN" value="#Form.ISBN#"
   cfsqltype="CF_SQL_VARCHAR">
</CFSTOREDPROC>

备注: 除非是作为条件指令表达式的一部分,否则,参数数组不能在循环外使用。


  上一页下一页