2

我一直无法找到这个问题的答案。在使用 NodeJS、Express 和 Express Bodyparser(以及我的 MEAN 堆栈的其余部分)时,我遇到了隐藏和禁用字段的问题:提交表单时它们不会出现在 req.body 对象中。

如果我理解正确的话,express 的 bodyparser 方面实际上取自另一个项目。无论如何,我还没有真正弄清楚为什么要删除这些字段或如何阻止这种情况发生。我怀疑它可能与方法覆盖有关,但启用/禁用它对相关字段没有影响。

所以.. 对于我自己和未来的谷歌人:这里发生了什么?

根据要求,这是一些代码:JADE:

form(action="/admin/users/edit", method="post", ng-submit='registerUser($event)', name='form', novalidate)
    .row(ng-show="ifweareupdating")
        label(for="_id") _id:
        input(type="hidden", id="_id", name="_id", ng-model="newUser._id")
        input(type="text", id="_notHiddenId', name="_notHiddenId", ng-model="newUser._id")

表示:

app.post("/admin/users/edit", pass.ensureAdmin, userRoutes.editUserPost);

用户路线:

exports.userRoutes.editUserPost = function(req,res,next) { 
    console.log(req.body._id) // logs undefined
    console.log(req.body._notHiddenId) // logs actual id
}
4

1 回答 1

5

这与 Express 无关。提交表单时,只有成功的控件才会被浏览器序列化和发送。

HTML 规范定义了使控件成功的原因。

一个成功的控件对于提交是“有效的”。每个成功的控件都将其控件名称与其当前值配对,作为提交的表单数据集的一部分。成功的控件必须在 FORM 元素中定义,并且必须具有控件名称。

然而:

  • 禁用的控件不能成功。
  • 如果一个表单包含多个提交按钮,只有激活的提交按钮是成功的。
  • 所有“打开”复选框都可能成功。
  • 对于共享相同 name 属性值的单选按钮,只有“on”单选按钮可能成功。
  • 对于菜单,控件名称由 SELECT 元素提供,值由 OPTION 元素提供。只有选定的选项可能会成功。如果未选择任何选项,则控件不成功,并且在提交表单时,名称和任何值都不会提交给服务器。
  • 文件选择的当前值是一个或多个文件名的列表。提交表单后,每个文件的内容都会与表单数据的其余部分一起提交。文件内容根据表单的内容类型打包。
  • 对象控件的当前值由对象的实现决定。

如果在提交表单时控件没有当前值,用户代理不需要将其视为成功的控件。

此外,用户代理不应认为以下控制成功:

  • 重置按钮。
  • 已设置声明属性的 OBJECT 元素。

由于样式表设置而未呈现的隐藏控件和控件可能仍会成功。

你的问题实际上是 Angular。 显然,它没有设置value隐藏输入。

于 2013-10-28T16:58:53.077 回答