2017-02-24 32 views
0

私は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; 
     } 
    } 

答えて

0

IValidatableObject短絡検証を使用:

は私の建設を説明するために、ここでは "親" ViewModelにあります。最初に返されたエラーにより、さらに検証が停止します。それはゲームの休憩です。その周りに方法はありません。

すべてのエラーを一度に処理する必要がある場合は、ビューモデルプロパティのデータ注釈を使用してモデルバインダーに検証を処理させる必要があります。独自の検証属性を追加することも、検証属性のライブラリが複数存在することもあります。

+0

すぐにお返事ありがとうございます。実際には、データアノテーションを必要に応じて作成するだけでよいのかと疑問に思っていました。しかし、検証機能ではもっと複雑な検証が必要です。私はSubModelから 'IValidationObject'を取り除き、代わりに親モデルにエラーを返し、prentレベルで子エラーを追加しました。それにもかかわらず、あなたのアドバイスはほとんどの場合、最も適切なものだと思います。 – doodles975

関連する問題