同じ値を持つレコードが存在しないことを確認するカスタム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
の現在の使用状況に関する最新のドキュメントを見つけるのは苦労しています。入力された値と一致するレコードが存在するかどうかを確認する方法を提案することはできますが、レコードが編集され、このフィールドの値が変更されていない場合に許可するレコードを許可しますか?
これは私が取り上げたアプローチです。 'validationContext.ObjectInstance as TrainerModel'を使用して、' null'が安全面にあることを確認してください。もしそれが 'null'の場合、私はエラーを返します。 –
はい私はあなたがエラー処理の世話をすると思った。 – CodingYoshi