2017-04-08 34 views
0

同じ値を持つレコードが存在しないことを確認するカスタムValidationAttributeを書き込もうとしています。カスタムValidationAttribute:編集中のオブジェクトを無視して重複値をチェックする方法

問題は、ユーザーが既存レコードを編集している場合は、私のコード同じ値と一致するレコードを検索することです。ユーザーがその値を変更していない場合、編集中のものが見つかります。

だから、私はそれが、このような何か変更されていないときを検出するためにValidationContext.ObjectInstanceの値に値を比較すると考えていた:

public class UrlTagValidationAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext context) 
    { 
     string tag = value as string; 
     if (string.IsNullOrWhiteSpace(tag)) 
      return new ValidationResult("URL Tag is required."); 

     // We allow a valid that is equal to the original value 
     if (context.ObjectInstance is TrainerModel model && model.Tag == tag) 
      return ValidationResult.Success; 

     // Cannot be an existing tag 
     using (var dbContext = new OnBoard101Entities()) 
     { 
      if (!dbContext.TrainerDetails.Any(td => td.Tag == tag)) 
       return ValidationResult.Success; 
     } 

     return new ValidationResult("This URL Tag is not available. Please enter a different one."); 
    } 
} 

をしかし、これは動作しません。 ValidationContext.ObjectInstanceの値は、新しいレコードを作成しているときに入力した値と一致することがよくあります。

ValidationContextの現在の使用状況に関する最新のドキュメントを見つけるのは苦労しています。入力された値と一致するレコードが存在するかどうかを確認する方法を提案することはできますが、レコードが編集され、このフィールドの値が変更されていない場合に許可するレコードを許可しますか?

答えて

0

現在編集中のアイテムは、それを識別するための何らかの種類のプロパティを持っています(データベース内でルックアップする)。したがって、重複するタグをデータベースで検索しているときに除外できるように、そのプロパティを取得する必要があります。カスタムバリデーションクラスでこれを行う方法は次のとおりです。私は、識別子がTrainerIdという名前であると仮定しています。

public class UrlTagValidationAttribute : ValidationAttribute 
{ 
    protected override ValidationResult IsValid(object value, ValidationContext context) 
    { 
     string tag = value as string; 
     if(string.IsNullOrWhiteSpace(tag)) 
      return new ValidationResult("URL Tag is required."); 

     var currentTrainer = validationContext.ObjectInstance 
           as TrainerModel; 
     if (currentTrainer == null) 
     { 
      // What do you want to do? You cannot always return an error 
      // because another type could be using this custom validation. 
      // Or you can return an error. Depends on your requirements and 
      // and usage. 
     } 
     using(var dbContext = new OnBoard101Entities()) 
     { 
      if(dbContext.TrainerDetails.Any(td => td.Tag == tag && td.TrainerId != 
              currentTrainer.TrainerId)) 
      { 
       return new ValidationResult("This URL Tag is not available. Please enter a different one."); 
      } 
     } 

     return ValidationResult.Success; 
    } 
} 
+0

これは私が取り上げたアプローチです。 'validationContext.ObjectInstance as TrainerModel'を使用して、' null'が安全面にあることを確認してください。もしそれが 'null'の場合、私はエラーを返します。 –

+0

はい私はあなたがエラー処理の世話をすると思った。 – CodingYoshi

関連する問題