【问题标题】:Error management in grailsgrails中的错误管理
【发布时间】:2013-04-01 11:42:54
【问题描述】:

我对 Grails 很陌生,在应用程序中我需要检查日期。在以前的 Java 程序中,我使用了两个具有不同细节粒度的 javascript 函数。两者都接受从 1970-01-01 到 2099-12-31 的日期。需要正确的日期和(可选)时间,然后告诉用户他/她输入了错误:

function okdate1(dtstr) {
  var ok = true;
  // First trim off leading and trailing white space
  var trimPattern = /(?:\b(.*)\b)/;
  dtstr = (dtstr.match(trimPattern))[1];
  // Verify that input is within range and correct
  var pat = /^((?:19[7-9][0-9])|(?:20[0-9][0-9]))-((?:(?:0)?[1-9])|(?:1[0-2]))-((?:(?:0)?[1-9])|(?:[1-2][0-9])|(?:3[01]))(?: ((?:(?:0|1)[0-9])|(?:2[0-3])):([0-5][0-9]))?$/;
  var dtm = dtstr.match(pat);
  if (!dtm) {
    ok = false;
  } else { // Verify that day in in range for the given month
    var days = Array(31,28,31,30,31,30,31,31,30,31,30,31);
    // Compensate for leap year
    if ((((dtm[1] % 4) === 0) && !((dtm[1] % 100) === 0)) || ((dtm[1] % 400) === 0)) {
        days[1] = 29;
    }
    if (dtm[3] > days[dtm[2] - 1]) ok = false;
  }
  if (!ok) alert("Enter date and (optionally) time on the form 'yyyy-MM-dd HH:mm'");
  return ok;
}

另一个通过接受输入字符串的数字部分的更大范围来准确检查出了什么问题:

function okdate2(dtstr) {
  // First trim off leading and trailing white space
  var trimPattern = /(?:\b(.*)\b)/;
  dtstr = (dtstr.match(trimPattern))[1];
  // If nothing then skip the rest
  if (!dtstr) return datetimealert(0);
  // Pattern to recognize any 'dddd-dd-dd[ dd:dd]' pattern
  var pat = /^(?:(\d{4})-(\d{1,2})-(\d{1,2}))(?: (\d{1,2}):(\d{2}))?$/;
  var dtm = dtstr.match(pat);
  // If this is does not follow the pattern: get out
  if (!dtm) return datetimealert(0);
  // convert each group to a number
  // if no time notation the corresponding groups become NaN
  for (var i = 1; i < dtm.length; i++) {
    dtm[i] = Number(dtm[i]);
  }
  // Check for correct year interval
  if (dtm[1] < 1970 || dtm[1] > 2099) return datetimealert(1);

  // Check for correct month notation
  if (dtm[2] < 1 || dtm[2] > 12) return datetimealert(2);

  // Array with correct numer of days for each month
  var mdays = Array(31,28,31,30,31,30,31,31,30,31,30,31);
  // Compensate for leap year
  if ((((dtm[1] % 4) === 0) && !((dtm[1] % 100) === 0)) || ((dtm[1] % 400) === 0)) {
    mdays[1] = 29;
  }
  // Check the day for the given month
  if (dtm[3] < 1 || mdays[dtm[2] - 1] < dtm[3]) return datetimealert(3);

  // If only date was given and no time, we are OK
  if (isNaN(dtm[4]) && isNaN(dtm[5])) return true;

  // This can not happen according to pattern, but ...
  if (isNaN(dtm[4]) || isNaN(dtm[5])) return datetimealert(4);

  // check given hour
  if (dtm[4] > 23) return datetimealert(5);

  // Check given minutes
  if (dtm[5] > 59) return datetimealert(6);

  // If no error
  return true;
} 

函数 datetimealert 发出带有(希望)好的错误消息的警报并返回 false。函数中的 'trimpattern' 去除前导和尾随空格。

我在表单中使用了它们,在“onsubmit”函数中调用它们。我在这里的目的不是讨论这两个函数,但当然欢迎使用它们的 cmets。

在我的 Grails 应用程序中,我使用带有 Trent Richardsons jQuery timepicker 插件扩展的 jQuery datepicker,因此我得到了一个文本字符串。我以一种形式调用 datetimepicker:

    <form ...
      <dl ...
        <dt>Start date <span class="required-indicator">*</span></dt>
        <dd>
          <div class="fieldcontain ${hasErrors(bean: todoInstance, field: 'startdate', 'error')} required">
            <g:textField name="startdate" id="datepicker" class="datepicker"
                 value="${formatDate(format:'yyyy-MM-dd HH:mm',date:todoInstance?.startad)}" required="" />
          </div>
        </dd>
        ...

对于所有其他“必填”字段,我会收到一条类似于“工具提示”的消息,告诉我 在字段中输入一个值。

现在,我想在我的 grails 应用程序中使用我的两个日期时间 javascript,但我不希望弹出警报框,我想在域类的静态约束部分中使用它们并在相同的情况下获取我的消息其他领域的方式。如何将它们集成到 i grails 的错误管理系统中?

【问题讨论】:

  • todoInstance?.startad 在最后一个代码块中应该是 todoInstance?.startdate

标签: javascript grails error-handling


【解决方案1】:

此错误消息由validation API 提供。要实现您自己的自定义验证,您可以使用约束 validator

但是我假设您已经在域类中将您的字段声明为java.util.Date,因此您需要在验证器中使用 Date 对象。默认情况下,Grails 使用g:datePicker 处理日期,这会将日期拆分为日、月和年字段。

要将具有某种格式的单个字符串绑定到日期对象,您可以注册自定义日期属性编辑器,例如this example

Grails 验证 API 用于服务器端验证。在您的情况下,一个选项是JQuery Validation UI Plugin,它通过 JQuery 提供客户端验证。该插件支持所有标准约束,您可以创建自己的验证(如日期验证),查看extensibility docs session

【讨论】:

  • 谢谢,但这不是问题。我处理转换。问题是将我的错误处理集成到 Grails 错误管理系统中。
  • 你的意思是你的 javascript 函数像其他 grails 验证一样显示错误 div 而不是警报?
  • 没错。我想用生成此类错误消息的调用替换警报,并了解如何将它们集成到我的应用程序中并利用验证基础架构中的功能。
猜你喜欢
  • 2013-01-24
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
相关资源
最近更新 更多