2013-10-09 45 views
5

我有一個窗體有兩個日期字段,開始日期和結束日期。我想驗證這兩個字段以確保開始日期在結束日期之前或之前。我寫了一個遠程驗證器並將其分配給兩個字段,但這可能導致出現同一個錯誤的多條消息。另外,如果我更正了一個日期,驗證不會在未修改的字段上觸發,並留下舊的錯誤消息ASP.Net MVC不顯眼的日期範圍驗證

如何驗證兩個日期字段彼此驗證開始日期是在結束日期之前還是結束日期?

回答

2

幾周前我有同樣的問題。恕我直言,我認爲解決問題的最好方法是使用jQuery實現客戶端控件。 通過這種方式,您可以在每次更改StartDate或EndDate上的值時調用驗證。在這種情況下,最好調用服務器來驗證客戶端上的數據,因爲您不調用服務器。

在以下鏈接中有一個實現客戶端驗證的過程。 Link

這是我的解決方案:

第1步:創建屬性類驗證連續日期

public class ConsecutiveDateAttribute : ValidationAttribute, IClientValidatable 
{ 
    public ConsecutiveDateAttribute() 
    { 
     ErrorMessage = "The date must be consecutive"; 
    } 

    public override bool IsValid(object value) 
    { 
     return true; 
    } 

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     var rule = new ModelClientValidationRule(); 
     rule.ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()); 
     rule.ValidationParameters.Add("datefield", metadata.PropertyName); 
     rule.ValidationType = "consecutivedate"; 
     yield return rule; 
    } 
} 

的IsValid方法的返回總是正確的,因爲我想驗證的客戶端 - 值側。 GetClientValidationRules函數用於向cshtml頁面傳遞couple字段名稱和事件驗證名稱,以調用每個字段的驗證。

第2步:使用屬性裝飾ConsecutiveDate,我想驗證

[Required(), DataType(DataType.Date), ConsecutiveDate()] 
    public DateTime StartDate { get; set; } 

    [Required(), DataType(DataType.Date), ConsecutiveDate()] 
    public DateTime EndDate { get; set; } 

第3步中的字段:實現頁面的JavaScript來驗證日期

<script src="@Url.Content("~/Scripts/jquery-1.10.2.js")" type="text/javascript" /> 
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript" /> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> 

<script type="text/javascript"> 

    if ($.validator && $.validator.unobtrusive) { 

     $.validator.unobtrusive.adapters.addSingleVal("consecutivedate", "datefield"); 

     $.validator.addMethod("consecutivedate", function(value, element) { 

      if ($("#StartDate").val() != "" && $("#EndDate").val() != "") 
       return $("#StartDate").val() <= $("#EndDate").val(); 

      // IF both values are not polupated I don't want to validate the field 
      return true; 
     }); 

    } 
</script> 

$ .validator。 addMethod(「continuousdate」,function(value,element)):這個註冊驗證我想要驗證的每個字段。

+0

請在這裏包含鏈接的內容 – deW1

+0

對不起是我的第一個回覆。 Nextone會更完整。感謝您的反饋意見。 –

相關問題