2016-04-07 89 views
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只需要修復?

回答

0

您可以在兩個input type="date"元素利用.change()事件,Array.prototype.every().eq()input type="date".valueAsDate財產,required屬性

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>