2017-02-09 81 views
0

我有兩個日期值,我需要驗證。此有效性是複合的:一個日期需要比另一個快(認爲StartingDate和FinishDate)。驗證兩個依賴日期

我該如何驗證?

基於此post,這似乎有類似的情況,一個推薦是使用MVC Foolproof Validation。這仍然是最好的選擇?是否有其他方式來驗證這樣的任務?

我在視圖中的代碼,如果它可以幫助:

<div class="row"> 
     <div class="col-md-3"> 
      <div class="row"> 
       <div class="col-md-5"> 
        <span class="glyphicon glyphicon-calendar" aria-hidden="true"></span> 
        <span style="font-size:large;">Início&nbsp;</span> 
       </div> 
       <div class="col-md-7"> 
        @Html.EditorFor(model => model.Inicio, new { htmlAttributes = new { @class = "form-control datetimepicker" } }) 
       </div> 
      </div> 
     </div> 
     <div class="col-md-3"> 
      <div class="row"> 
       <div class="col-md-5"> 
        <span class="glyphicon glyphicon-calendar" aria-hidden="true"></span> 
        <span style="font-size:large;">Fim&nbsp;</span> 
       </div> 
       <div class="col-md-7"> 
        @Html.EditorFor(model => model.Fim, new { htmlAttributes = new { @class = "form-control datetimepicker" } }) 
       </div> 
      </div> 
     </div> 
    </div> 

    <script> 
<!--jQuery DateTimePicker--> 
     jQuery('.datetimepicker').datetimepicker({ 
      format: 'd/m/Y H:i' 
     }); 

    </script> 
+0

是否需要此驗證在視圖中做些什麼呢?因爲如果正在提交此頁面,您還可以在控制器中檢查此信息,並在條件爲真時返回錯誤消息。 –

+0

頁面正在提交併且不是,它不一定必須位於視圖中。你能否給我看一個這樣驗證的模糊例子? – Lernas

+0

就這樣,我明白清楚..你需要的只是確認endDate是否小於startdate? –

回答

2

我不明白爲什麼一個簡單的JS解決方案不能幫助這裏,所以這裏是:

HTML:

<p>Start Date: <input type="text" id="datepicker1"></p> 

<p>End Date: <input type="text" id="datepicker2"></p> 

<button id="TestCondition"> 
    Click Me! 
</button> 

JS:

$(function() { 
    $("#datepicker1").datepicker(); 
}); 

$(function() { 
    $("#datepicker2").datepicker(); 
}); 

$("#TestCondition").click(function(){ 
    alert($("#datepicker1").val()); 
    alert($("#datepicker2").val()); 

    if($("#datepicker2").val() < $("#datepicker1").val()){ 
     alert("End Date must come after Start Date!"); 
    } 
}); 

這裏是一個小提琴:JSFiddle

替代的解決方案使用控制器在MVC

您提交此頁到控制器,你可以做一個檢查,像這樣(C#):

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult NameOfAction(ViewModel nameOfViewModel) 
{ 
    if(nameofViewModel.FinishDate <= nameofViewModel.StartDate) 
    { 
     ModelState.AddModelError("FinishDate", "Finish Date needs to be after the Start Date!"); 
     return View(nameOfViewModel); 
    } 
} 

讓我知道這是否有幫助,或者是否需要更改。

+0

替代解決方案有訣竅,稍微調整一下,當我更新問題時,我會在第二個示例中展示JS解決方案可能會工作,或許我已經搞笑了,也許$(「 #id「)。val()不會在我的情況下工作,可能是由於我的日期值是如何形成的(dd/MM/yyyy)。 – Lernas

+0

@Lernas很高興我可以幫助!請將答案標記爲已接受,以便這個問題可以看作是回答。 –

+0

Ofcourse,謝謝! – Lernas

0

基於BviLLe_Kid答案,這我承認,這是我落得這樣做:

if (ModelState.IsValid) 
    { 
     if (nameofViewModel.FinishDate <= nameofViewModel.StartDate) 
     { 
      ModelState.AddModelError(string.Empty, "Error message here"); 
      return View(nameofViewModel); 
     } 
     else { 
      //code for when validation is OK 
     } 
    } 

在視圖:

<div style="color:red;"> 
    @Html.ValidationSummary(true) 
    @Html.ValidationMessageFor(model => model.FinishDate) 
</div>