1

我正在尝试验证是否已通过 ColdFusion 中的服务器端选择了单选按钮。如果为空,则文本输入错误,但是,如果未选择单选按钮组,则不会触发错误。我似乎找不到任何关于此的文档。

  <cfform name="mobile_device_request" id="form" action="">
      Text Box:
      <cfinput type="Text" name="subscriber" message="Please enter in a subscriber" required="yes" validateat="onserver">

      Subscriber:
      <cfinput type="Radio" name="service_provider" value="AT&amp;T" required="yes" validateat="onserver"><span class="label">AT&amp;T</span>
      <cfinput type="Radio" name="service_provider" value="Sprint" required="yes" validateat="onserver"><span class="label">Sprint</span>
      <cfinput type="Radio" name="service_provider" value="Verizon" required="yes" validateat="onserver"><span class="label">Verizon</span>
4

1 回答 1

2

解释:

要回答您的问题,虽然我从未使用过该功能,但我会说这是一个错误。

根据文档 onServer验证通过自动附加具有特殊命名约定的隐藏表单字段来工作。然后,CF 服务器检查表单字段名称中某些模式的所有请求,例如以_requiredor结尾的请求_cfformrequired,如果找到,则对相关字段执行验证。

如果您查看 cfform 的源代码,请注意 CF 添加了几个隐藏字段:

<input type='hidden' name='subscriber_CFFORMREQUIRED' value='Please enter in a subscriber'>
<input type='hidden' name='service_provider_CFFORMREQUIRED' value='Error in service_provider text.'>
<input type='hidden' name='service_provider_CFFORMREQUIRED' value='Error in service_provider text.'>
<input type='hidden' name='service_provider_CFFORMREQUIRED' value='Error in service_provider text.'>

这些应该会触发 CF 对这两个字段的服务器端验证。但是,正如您所发现的,它仅适用于文本字段,而不适用于单选按钮。虽然奇怪的是,如果您手动添加一个以 结尾的隐藏字段,它就可以正常工作_required

    <input type="hidden" name="service_provider_required" 
         value='You forgot to select a service_provider'>

回答:

同样,我认为您看到的行为可能是一个错误。坦率地说,是众多cfform. 就个人而言,我建议放弃cfform/cfinput. 使用纯 html 输入并编写您自己的验证。由于它是一个单选按钮,因此只有在选中其中一个按钮时才会定义该字段。因此,您可以测试该字段是否存在:

    <cfif NOT structKeyExists(FORM, "service_provider")>
        no service_provider selected. do something
    </cfif>

...或分配一个默认值,并测试该值:

    <!--- default to empty string --->
    <cfparam name="FORM.service_provider" default="">
    <cfif NOT len(FORM.service_provider)>
        no service_provider selected. do something
    </cfif>
于 2013-10-19T04:10:18.233 回答