【问题标题】:Pug (RIP Jade) form checkboxes - only one value returned regardless how many selectedPug (RIP Jade) 表单复选框 - 无论选择多少,都只返回一个值
【发布时间】: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


【解决方案1】:

经过一番研究,我发现:

这种传递数组的方法高度依赖于服务器,它将如何理解数据负载,PHP 理解这种语法,但 JSON 对象有不同的安静。

form#create-shift-form(action='/shifts/new', method='post')
  div.form-group
    p Select which days this shift should apply:
      each val, index in ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']
        div.checkbox-inline
          input.checkbox-input(type='checkbox', name=`days[${index}]`, value=val, id=`create-shift-${val}`)
          label(for=`create-shift-${val}`)=val

这将有效载荷相当于这样的东西:

days[0]=Mon
days[1]=Tue
days[2]=Wed
days[3]=Thur
days[4]=Fri
days[5]=Sat
days[6]=Sun

相当于json中的这个payload:

{
   days: ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun']
}

来源:https://darobin.github.io/formic/specs/json/

更新:

供日后参考: OP 解决问题,解决方案 (days[${index}]) 是正确的,但是 express body parser extended:true 使用 querystring 而不是 qs

使用extended:false,JSON 按预期工作。有效载荷变为"days[0]"="Mon", "day[1]"="Tues", etc.

app.use(bodyParser.urlencoded({ extended: false }); //instead of true

【讨论】:

  • 我用上面的建议替换了我的代码,但是我仍然只检索最后一个选定的项目作为字符串,而不是项目的数组。我得到{ "days":"Thur" }
  • 我的 Node/Express 服务器设置为:app.use(bodyParser.json());app.use(bodyParser.urlencoded({ extended: true }));
  • @eugene1832 我更新了代码以具有一个名称和不同的值,它现在应该可以工作了。告诉我结果:)
  • 不,我已经试过了!它绝对应该有效,但事实并非如此。我不确定我应该从哪里找出问题所在。
  • @eugene1832 问题不是来自 pug,它可能是你在这里没有提到的其他东西,也许你可以创建一个只有这个代码的小项目,让它工作并查看差异。
猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2017-08-10
  • 2016-10-27
相关资源
最近更新 更多