cfgridupdate标签无法找到doclist网格,请求问题排查
以下是导致错误的核心问题及修复步骤:
1. cfgridupdate执行时机错误
Master_Doc_Maint.cfm中,<cfgridupdate>标签直接写在页面<head>区域,每次加载页面都会执行,但此时并没有表单提交的网格数据,因此触发"找不到doclist网格"的错误。同时表单的action指向handle_grid.cfm,更新逻辑应该统一放在处理页面中,而非原展示页面。
修复:删除Master_Doc_Maint.cfm里的<cfgridupdate>标签,将更新逻辑全部移到handle_grid.cfm中。
2. 表单数据引用错误
handle_grid.cfm中用Form.docgrid.rowstatus.action获取网格操作,但网格的实际名称是doclist,docgrid只是表单名。ColdFusion提交网格数据时,会以网格名作为表单数据的前缀,而非表单名。
修复:将handle_grid里所有Form.docgrid替换为Form.doclist,示例修正片段:
<cfif isdefined("Form.doclist.rowstatus.action")> <cfloop index = "counter" from = "1" to = #arraylen(Form.doclist.rowstatus.action)#> <cfoutput> 第#counter#行的操作是:#Form.doclist.rowstatus.action[counter]#<br> </cfoutput> <cfswitch expression="#Form.doclist.rowstatus.action[counter]#"> <cfcase value = "U"> <cfquery name="query_update" datasource="mydatastore"> UPDATE MDL_MASTER_LIST SET active = <cfqueryparam value='#form.doclist.active[counter]#' CFSQLType="CF_SQL_VARCHAR">, admin = <cfqueryparam value='#form.doclist.admin[counter]#' CFSQLType="CF_SQL_VARCHAR"> <!-- 其他字段同理替换为Form.doclist前缀 --> WHERE doc_number = <cfqueryparam value='#form.doclist.original.doc_number[counter]#' CFSQLType="CF_SQL_VARCHAR"> </cfquery> </cfcase> </cfswitch> </cfloop> </cfif>
3. 更新查询包含未定义字段
handle_grid的UPDATE语句中使用了is_contact和is_file字段,但原查询get_all_docs和cfgrid列中都没有这些字段,表单提交时不会传递这些值,会触发变量未定义错误。
修复:删除UPDATE语句中这两个不存在的字段,或者在原查询和cfgrid中添加对应的列。
4. HTML结构不规范
Master_Doc_Maint.cfm中,<cfform>、<cfgridupdate>、链接等内容都放在<head>标签内,不符合HTML规范,可能导致页面渲染异常,影响网格的正常提交。
修复:将表单、链接等内容移动到<body>标签内,调整后的结构示例:
<html> <head> <title>Master List Maintenance</title> <!-- 其他head内容 --> </head> <body> <!-- 权限判断 --> <cfif NOT listfindnocase(application.admins,application.wsl_cdsid)> Sorry. You are not listed as an admin. <cfabort> </cfif> <!-- 查询数据 --> <cfquery datasource="mydatastore" name="get_all_docs"> SELECT SITE,SECTIONS,TAB,DOC_NUMBER,DESCRIPTION,REV_LEVEL,REVISION_DATE,REVIEW_DATE,ADMIN,ACTIVE from MDL_MASTER_LIST ORDER BY SITE,sections,TAB,DOC_NUMBER </cfquery> <!-- 表单与网格 --> <cfform name="docgrid" action="handle_grid.cfm"> <cfgrid name="doclist" align="Top" autowidth="yes" bgcolor="FFF" colheaderbold="yes" selectmode="edit" format="html" griddataalign="left" gridlines="yes" query="get_all_docs" sort="yes" striperowcolor="FC6" striperows="yes" width=1650 insert="Yes" delete="yes" key="DOC_NUMBER"> <!-- 添加key属性指定主键 --> <cfgridcolumn name="Site" width="100"> <!-- 其他列定义 --> </cfgrid> <br> <cfinput name="UpdateDocs" type="Submit" value="Update"> </cfform> <a href="Master_Doc_Maint.cfm">返回查看更新后的网格</a> </body> </html>
额外优化建议
在<cfgrid>标签中添加key="DOC_NUMBER"属性,明确指定主键字段,ColdFusion会自动传递原始主键值,确保更新、删除操作的准确性。
内容的提问来源于stack exchange,提问作者Plumbboy77

