私はC#MVC 4 serversidedを使用しています。サイトのGerenelの目的は、入力されたテキスト情報とユーザーがコミットしたファイルを取得することです。MVC 4自動モデル検証は、ViewModelを入れ子にしたViewModelでスタックします
したがって、私はViewModelを使用します。ViewModelは、FileInformationViewModelという名前のユーザーが入力したテキスト情報に関する情報を保持する「親」ViewModelです。この「親」ViewModelには別の「子」ViewModelが含まれており、FileUploadViewModelと呼ぶことができます。
これらのViewModelのそれぞれは、IValidateObjectから派生し、Modelの現在の属性のみを検証する独自のValidate関数を所有しています。これは、「子」ViewModelが独自の特定の検証機能を所有しているため、「親」ViewModelが「子」ViewModelの検証を実行しないことを意味します。
"子" ViewModelは、MVC 4が提供する自動モデル検証によって検証され、ModelStateは期待どおりに設定されます。その後、「子」ViewModelは、MVCモデルバインディングロジックによって「親」ViewModelに正常にバインドされます。 "子" ViewModelの検証が失敗した場合、 "親" ViewModelのValidate関数はもう処理されませんが、Model Bindingで自動化された両方の検証を処理したいと思います。これを達成する方法はありますか、コントローラのViewModelを手動で検証する唯一の方法はありますか?
public class FileInformationViewModel : IValidatableObject
{
public FileInformationViewModel()
{
ViewModel1 = new FileUploadViewModel();
}
public FileUploadViewModel ViewModel1 { get; set; }
public string InputFieldToBeSet { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!string.IsNullOrWhiteSpace(InputFieldToBeSet))
{
var result = new ValidationResult("Enter some information, please!", new[] { nameof(InputFieldToBeSet) });
yield return result;
}
}
すぐにお返事ありがとうございます。実際には、データアノテーションを必要に応じて作成するだけでよいのかと疑問に思っていました。しかし、検証機能ではもっと複雑な検証が必要です。私はSubModelから 'IValidationObject'を取り除き、代わりに親モデルにエラーを返し、prentレベルで子エラーを追加しました。それにもかかわらず、あなたのアドバイスはほとんどの場合、最も適切なものだと思います。 – doodles975