2013-10-09 67 views
5

私は2つの日付フィールド、開始日と終了日を持つフォームを持っています。開始日が終了日以前であることを確認するために、2つのフィールドを検証したいと思います。私は、リモートバリデータを書いて両方のフィールドに割り当てましたが、それは同じエラーのために複数のメッセージにつながる可能性があります。また、1つの日付を修正すると、変更前のエラーメッセージが残っている未修正のフィールドで検証が実行されません。ASP.Net MVC控えめな日付範囲のバリデーション

開始日が終了日か終了日かを確認するために2つの日付フィールドを互いに検証しますか?

答えて

2

私は数週間前に同じ問題がありました。 IMHO私は問題を解決する最良の方法は、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ページに渡すために使用されます。

ステップ2:

<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を日付を検証するページではJavaScriptを実装します。属性ConsecutiveDate私は

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

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

ステップ3を検証するフィールドで飾ります。 addMethod( "consecutivedate"、function(value、element)):これは、検証する各フィールドの検証を登録します。

+0

ここにも内容を含めてください。 – deW1

+0

私の最初の返事はすみませんでした。 Nextoneはより完全になります。ご意見ありがとうございます。 –