2016-08-10 3 views
2

作成したカスタム検証にデータを渡す方法を理解しようとしています。変数をCustomValidationに渡す方法を理解しようとしていますか?

私はこのモデルを持っています。

public class MyModel 
{ 
    [Required(ErrorMessage="Please enter a Start Date")] 
    public DateTime StartDate { get; set; } 

    [Required(ErrorMessage="Please enter an End Date")] 
    [CustomValidation(typeof(DateCompareValidation), "ValidateDates")] 
    public DateTime EndDate { get; set; } 
} 

これは私のバリデータです。

public class DateCompareValidation 
{ 
    public static ValidationResult ValidateDates(object value, ValidationContext context) 
    { 
     return new ValidationResult("You are wrong"); 
    } 
} 


Iは、(パブリック静的ValidationResult ValidateDatesを有していた)、それは私が必要なパラメータを追加

"..must match the expected signature: public static ValidationResult ValidateDates(object value, ValidationContext context)." 

のためにエラーが発生した初めて。

ここで、変数「値」には私の終了日があります。
私はそれがどのパラメータを必要としているかをよく理解していません。
さらに、開始日またはMyModelクラスを渡すことで、検証ロジックを処理することができます。

+0

あなたは何をしたいと思いますか? 'DateTime'が' StartDate'よりも大きいことを比較しますか? –

+0

はい。この特定のケースでは、私が望むのは、有効な日付怒りが入力されていることを確認することです。これがどのように機能するかを理解すれば、より複雑なバリデータを書く必要が生じるかもしれません。 – PrivateJoker

+0

私はあなたの[[ASP.NET MVC 3のパート2の完全なガイド](http://www.devtrends.co.uk/blog/the-complete-guide-to-validation-in-asp)をお読みになることをお勧めします。 net-mvc-3-part-2) –

答えて

0

何ちょうどクラスにロジックを追加し、IValidateObjectを実装してはどうですか?

public class MyClass : IValidatableObject 
    { 
     [Required(ErrorMessage="Please enter a Start Date")] 
     public DateTime? StartDate { get; set; } 

     [Required(ErrorMessage="Please enter an End Date")] 
     public DateTime? EndDate { get; set; } 

     public IEnumerable<ValidationResult> Validate(ValidationContext context) 
     { 
      if (EndDate < StartDate) 
      { 
       yield return new ValidationResult("Invalid date range: End date must be greater then the Start Date"); 
      } 
     } 
} 
0

これが役に立ちます。

class CustomLengthValidatorAttribute : ValidationAttribute 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="CustomLengthValidatorAttribute" /> class. 
    /// </summary> 
    /// <param name="maxLength">The maximum length.</param> 
    public CustomLengthValidatorAttribute(int maxLength) 
    { 
     this.MaxLength = maxLength; 
    } 

    /// <summary> 
    /// Gets the minimum length. 
    /// </summary> 
    /// <value> 
    /// The minimum length. 
    /// </value> 
    public int MaxLength { get; private set; } 

    /// <summary> 
    /// Validates the specified value with respect to the current validation attribute. 
    /// </summary> 
    /// <param name="value">The value to validate.</param> 
    /// <param name="validationContext">The context information about the validation operation.</param> 
    /// <returns> 
    /// An instance of the <see cref="T:System.ComponentModel.DataAnnotations.ValidationResult" /> class. 
    /// </returns> 
    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     string fieldName = validationContext.MemberName; 
     if (Convert.ToString(value).Trim().Length > this.MaxLength) 
     { 
      return new ValidationResult(this.ErrorMessage = fieldName + " should not be longer than " + this.MaxLength + " character"); 
     } 

     return ValidationResult.Success; 
    } 
} 
0

ご質問には正確に回答していませんが、FluentValidationをご覧ください。 組み込みのASP.NET MVC属性ベースの検証を、(ユーザ定義のバリデータクラスを使用して)流暢な構文インタフェースで完全に置き換えることができます。あなたはそれを試してみるために興味があるなら、FluentValidation.MVC5(またはのための適切なを取得するようにしてください

// validator class for your view model 
public class MyModelValidator : AbstractValidator<MyModel> 
{ 
    public MyModelValidator() 
    { 
     RuleFor(m => m.EndDate).NotNull().WithMessage("Please enter an End Date"); 
     RuleFor(m => m.StartDate).NotNull().WithMessage("Please enter a Start Date") 
      .LessThan(m => m.EndDate).WithMessage("Start Date must preceed End Date"); 
    } 
} 

// declare MyModelValidator as a validator for view model 
[Validator(typeof(MyModelValidator))] 
public class MyModel 
{ 
    public DateTime StartDate { get; set; } 
    public DateTime EndDate { get; set; } 
} 

:あなたはそのStartDate preceeds EndDateを検証したい場合

例えば、それは次のようになります。あなたが使用しているMVCのバージョン、この投稿を書いている時点でFluentValidation.MVC6はベータ版です)nuget。あなたがする必要があると思いすべてがそうのようなのglobal.asaxに登録することです:

protected void Application_Start() 
{ 
    ... 
    FluentValidationModelValidatorProvider.Configure(); 
} 
関連する問題