【发布时间】:2016-09-02 20:06:38
【问题描述】:
我有一个用 Pug 写的表格。我从表单的 POST 中获取了所有正确的参数,除了我的复选框数组是一个包含一个值的字符串 - 选择的最新日期。每个复选框都有一个等于数组的名称,因此表单应该返回所有选中的复选框。然而,这并没有发生。
这里是复选框选择表单中的相关代码:
form#create-shift-form(action='/shifts/new', method='post')
div.form-group
p Select which days this shift should apply:
div.checkbox-inline
input.checkbox-input#create-shift-mon(type='checkbox', name='days[]', value='Mon')
label(for='create-shift-mon') Mon
div.checkbox-inline
input.checkbox-input#create-shift-tue(type='checkbox', name='days[]', value='Tue')
label(for='create-shift-tue') Tue
div.checkbox-inline
input.checkbox-input#create-shift-wed(type='checkbox', name='days[]', value='Wed')
label(for='create-shift-wed') Wed
div.checkbox-inline
input.checkbox-input#create-shift-thur(type='checkbox', name='days[]', value='Thur')
label(for='create-shift-thur') Thur
div.checkbox-inline
input.checkbox-input#create-shift-fri(type='checkbox', name='days[]', value='Fri')
label(for='create-shift-fri') Fri
div.checkbox-inline
input.checkbox-input#create-shift-sat(type='checkbox', name='days[]', value='Sat')
label(for='create-shift-sat') Sat
div.checkbox-inline
input.checkbox-input#create-shift-sun(type='checkbox', name='days[]', value='Sun')
label(for='create-shift-sun') Sun
为什么没有在表单的 POST 中捕获所有选中的复选框值?为什么它只返回最后一个选定值的字符串而不是所有选定值,这是预期的 HTML 行为?
如果有帮助,我的 Node/Express 服务器将设置为使用以下行解析内容:
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
根据this W3C Spec,我应该能够为每个复选框输入相同的名称,并且它们将在 POST 时被解析为值数组(参见规范中的示例 2)。我也试过这个,这会导致与我的问题相同的行为 - 只返回最后一个选定的项目,并且作为字符串,而不是数组。
更新:我上面代码的原始设置是正确的。只需为每个属性的 name 字段赋予相同的名称,即可将响应组合成一个数组。我已经设置了 middleware,但我忘记了以防止数组响应作为安全措施。删除该库,或将此表单 POST 到的路由列入白名单,可使原始代码正常工作。
【问题讨论】:
-
我仍然不完全理解您想要达到的目标?该名称只是一个字符串
days[]它不是一个数组,也不是在 pug 中评估 -
在最后给名称字段一个 [] 应该使表单返回具有该名称 [] 的所有选定值作为选定值的数组。出于某种原因,这并没有以我的形式发生。我想知道它是否与表单的 Pug 处理有关,但我真的不知道。这是我从快速谷歌搜索中提取的一个例子来说明:designedbyaturtle.co.uk/2014/submit-an-array-with-a-html-form
标签: node.js forms checkbox pug