我使用帆.js我想知道是否有更好的方法来管理提交表单后的下拉列表人口。
// app/api/controllers/UserController.js
module.exports = {
form: (req, res) => {
let cProfiles, cGroups;
Profiles.find()
.then(profiles => {
cProfiles = profiles;
return Groups.find();
})
.then(groups => {
cGroups = groups;
return res.view('users/form', { cProfiles, cGroups }); // cProfiles and cGroups used to populate dropdown lists in the form
})
});
},
add : (req, res) => {
req.checkBody({...}); // I use express-validator
let errors = req.validationErrors();
if ( errors ) {
// manage errors
}
else {
User.create({...}).then(user => res.redirect('/user'));
}
}
}
.
// app/config/routes.js
module.exports.routes = {
...
'get /user' : 'UserController.form',
'post /user' : 'UserController.add',
...
}
提交表单后,如果出现错误,我想再次显示我的表单,并填充所有字段和错误。我必须在 add 函数中重复所有 find().then() 的事情吗?
也许您可以使用Flash消息:
在服务器代码中,您可以使用req.flash()
:
form: (req, res) => {
let errors = req.validationErrors();
if ( errors ) {
// manage errors
req.flash('error', "MY_ERROR_MESSAGE");
}
在 EJS 中,您需要在会话中获取闪存消息。我创建了一个这样的部分 ejs
<% if (req.session.flash) { %>
<% if (req.session.flash.success) { %>
<% for(var i=0; i<req.session.flash.success.length; i++) {%>
<div data-alert class="alert-box success radius">
<%= req.session.flash.success[i] %>
<a href="#" class="close">×</a>
</div>
<% } %>
<% req.session.flash.success = undefined %>
<% } %>
<% if (req.session.flash.warning) { %>
<% for(var i=0; i<req.session.flash.warning.length; i++) {%>
<div data-alert class="alert-box warning radius">
<%= req.session.flash.warning[i] %>
<a href="#" class="close">×</a>
</div>
<% } %>
<% req.session.flash.warning = undefined %>
<% } %>
<% if (req.session.flash.error) { %>
<% for(var i=0; i<req.session.flash.error.length; i++) {%>
<div data-alert class="alert-box alert radius">
<%= req.session.flash.error[i] %>
<a href="#" class="close">×</a>
</div>
<% } %>
<% req.session.flash.error = undefined %>
<% } %>
<% } %>
最后在 layout.ejs 中:
<body>
<%- partial('partial/flash') %>
<%- body %>
...
</body>
我会亲自在客户端进行验证。如果你要求信息是强制性的,那么你可以使用非常简单的html验证器。
http://www.w3schools.com/js/js_validation.asp - 向下滚动以查看"约束验证 HTML 输入属性"
这将清理您的大部分用例,对于更复杂的情况,我会使用客户端库。
简而言之,首先要阻止垃圾进入您的控制器和模型,因此请从视图验证中攻击它。之后,检查控制器中的关键参数以保护模型,正如您所说,如果您遇到问题,这可能会导致使用 find() 等。或者,您可以捕获 req.param 输入并将该数据直接推送回重定向(或者只是执行 res.view('page',dataitems))路由,并通过 jquery 或 ejs 模板处理对相关控件的分配。