0

我想使用万无一失的验证比较两个日期字段,其中第二个字段必须大于第一个字段。但是,两者都可以为空。即使使用 PassOnNull = True,当两个字段都为空时,验证也会失败。使用 [GreaterThanOrEqualTo] 可以按预期工作,但我的第二个日期必须更大。

[GreaterThan("DateFrom", PassOnNull = true, ErrorMessage = "Date To must be greater than Date From")]
public DateTime? DateTo { get; set; }

在查看源代码时,当任一字段为空(但不是两者)时,它会绕过验证。这背后有什么原因吗?这对我来说真的没有意义。我可以轻松更改源,但作为 NuGet 安装,我只能任由它被覆盖。否则,我可以手动包含它并完成。这是源代码片段:

    if (passOnNull) {

        var isNullish = function (input) {
            return input == null || input == undefined || input == "";
        };

        var value1nullish = isNullish(value1);
        var value2nullish = isNullish(value2);

        if ((value1nullish && !value2nullish) || (value2nullish && !value1nullish))
            return true;
    }

在我能想到的几乎任何情况下,以下修改对我来说都更有意义,因为必填字段仍然需要通过自己的验证:

        if (value1nullish || value2nullish)
            return true;

我应该用另一种方法来验证这一点,还是 FoolProof 只需要修复?

4

1 回答 1

0

您可以在两个元素上使用.change()event, Array.prototype.every(), .eq(), .valueAsDateproperty of input type="date",属性requiredinput type="date"

var dates = $("input[type=date]");

dates.change(function(e) {
  if (dates.get().every(function(el) {
        return el.valueAsDate !== null
      }) 
      && dates.eq(1)[0].valueAsDate > dates.eq(0)[0].valueAsDate) {
        alert(true)
  } else {
      alert(false)
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<form>
  <input type="date" name="date1" required />
  <input type="date" name="date2" required />
  <input type="submit" />
</form>

于 2016-04-07T21:25:44.903 回答