开机自检后如何不重复下拉填充



我使用帆.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">&times;</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">&times;</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">&times;</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 模板处理对相关控件的分配。

最新更新