【问题标题】:HTML form error in ColdFusion: "Element __ is undefined in FORM."ColdFusion 中的 HTML 表单错误:“元素 __ 在 FORM 中未定义。”
【发布时间】:2014-01-10 00:01:20
【问题描述】:

我正在尝试提交一个 html 表单,其中包含一周中各天的复选框。当它们被选中时,我为该复选框传递了一个值 1。为了处理未选中的框,我在表单操作页面的 CFPARAM 标记中传递了一个值 0。

我采用这些表单输入并将它们添加到我传递给 Web 服务的结构中。


表单代码(opentroubleticket.cfm):

<form action = "opentroubleticketaction.cfm" method="post" id="myForm" name="myForm">
    <cfoutput><input type="checkbox" name="Loc_Mon" value="1"> MON </cfoutput>
    <cfoutput><input type="checkbox" name="Loc_Tue" value="1"> TUE</cfoutput>
    <cfoutput><input type="checkbox" name="Loc_Wed" value="1"> WED </cfoutput>
    <cfoutput><input type="checkbox" name="Loc_Thu" value="1"> THU </cfoutput>
    <cfoutput><input type="checkbox" name="Loc_Fri" value="1" > FRI</cfoutput>
    <cfoutput><input type="checkbox" name="Loc_Sat" value="1" > SAT</cfoutput>
    <cfoutput><input type="checkbox" name="Loc_Sun" value="1" > SUN</cfoutput> 
    <input type="submit" name="submit" value="SUBMIT" class="beef">
</form> 


操作代码(opentroubleticketaction.cfm):

<cfparam name="Loc_Mon" default="0">
<cfparam name="Loc_Tues" default="0">
<cfparam name="Loc_Wed" default="0">
<cfparam name="Loc_Thu" default="0">
<cfparam name="Loc_Fri" default="0">
<cfparam name="Loc_Sat" default="0">
<cfparam name="Loc_Sun" default="0">

<!---some other stuff--->

<cfscript>
    BodyRT = structNew();
    BodyRT.RepairRequest = structNew();
    BodyRT.RepairRequest['Loc_Mon']=form.Loc_Mon;
    BodyRT.RepairRequest['Loc_Tue']=form.Loc_Tue;
    BodyRT.RepairRequest['Loc_Wed']=form.Loc_Wed;
    BodyRT.RepairRequest['Loc_Thu']=form.Loc_Thu;
    BodyRT.RepairRequest['Loc_Fri']=form.Loc_Fri;
    BodyRT.RepairRequest['Loc_Sat']=form.Loc_Sat;
    BodyRT.RepairRequest['Loc_Sun']=form.Loc_Sun;
</cfscript>

<!---some other stuff--->

当我提交带有所有复选框的表单时,它会通过并正确传递给 Web 服务,每个输入的 value=1。当我提交带有未选中框的表单时,我收到此错误:
Element LOC_MON is undefined in FORM
即使我使用CFPARAM 标签设置了默认值,为什么元素未定义?

如果我选中 MON 框,它会显示 Element LOC_TUE is undefined in FORM,依此类推。

【问题讨论】:

  • 如果它只发生在星期二,我会说这是因为输入元素的名称与 cfparam 不匹配。
  • 你应该在你的&lt;cfparam&gt;标签中限定你的表单变量(事实上,一直都是:总是限定你的变量)。如果——为了论证——如果你已经有一个变量variables.Loc_Mon,你的无范围&lt;cfparam&gt;不会帮助你默认form.Loc_Mon
  • 感谢@AdamCameron,这是一个很好的观点......它没有解决问题,但我还是添加了它以获得最佳实践。
  • 仅供参考,而不是使用cfparam,您可以在结构中使用它BodyRT.RepairRequest['Loc_Mon'] = structKeyExists(form,'Loc_Mon') ? form.Loc_Mon : 0;
  • 旁注:除非您从 opentroubleticket.cfm 中删除了一些输出 CFML 变量值的代码,否则您可以删除所有 &lt;cfoutput&gt; 标记。或者至少将整个表单包装在一个 &lt;cfouput&gt; 标记中。

标签: html forms coldfusion coldfusion-8


【解决方案1】:

您看到的是 HTML 表单中复选框的默认行为。只有检查框(ES),才能通过该值。如果未选中,则不会传递表单字段。

Reference

正如 cmets 中所述,您的 &lt;cfparam&gt; 标记没有捕捉到这种情况的原因是您没有限定它们的范围。这应该可以解决您的问题。

我还在 cmets 中注意到您说范围界定并没有解决问题。那是因为您的代码中也有错字(或至少是不匹配)。在周二变量的&lt;cfparam&gt; 标记中,您将名称设置为Loc_Tues(注意末尾的“s”)。稍后在您的代码中,您指的是Loc_Tue(没有's')。因此,在您的 &lt;cfparam&gt; 标签中添加 form. 范围并修复该不匹配,然后您就可以开始了。

<cfparam name="form.Loc_Mon" default="0">
<cfparam name="form.Loc_Tue" default="0">
<cfparam name="form.Loc_Wed" default="0">
<cfparam name="form.Loc_Thu" default="0">
<cfparam name="form.Loc_Fri" default="0">
<cfparam name="form.Loc_Sat" default="0">
<cfparam name="form.Loc_Sun" default="0">

【讨论】:

  • 谢谢@Miguel!在我的 cfparam 标签中添加 form. 范围就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多