IValidatableObject
次のような文字列と別のビューモデルのコレクションを含む実装するビューモデルがあります。
public sealed class MainViewModel
{
public string Name { get; set; }
public ICollection<OtherViewModel> Others { get; set; }
}
私の検証ではOthers
、によって提供されるコントラクトを使用して、さまざまなルールに対して各オブジェクトをチェックしIValidatableObject
ます。
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
foreach (var other in this.Others)
{
// validate or yield return new ValidationResult
}
}
実物の複雑な構造のため、MainViewModel
モデルを再構築し、関連するコンポーネントに POST データを割り当てるカスタム モデル バインダーを作成する必要がありました。私が得ている問題は、特定のデータベースの制約に違反しているため、何も検証されず、コンテキストレベルで検証エラーが発生し、何が間違っているのかわからないことです-ビューでメソッドをModelState.IsValid
呼び出すと想定しましたValidate
モデルですが、それほど下がらないようです。
私のモデル バインダーは次のようになります。
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
int modelId = (int)controllerContext.RouteData.Values["id"];
// query the database and re-build the components of the view model
// iterate the POST data and assign to the model where necessary
// should I be calling something here to validate the model before it's passed to the controller?
return model;
}
どんな助けでも大歓迎です!
Validator.TryValidateObject
OK、少し近づいたようです。IValidatableObject
カスタム モデル バインダーに以下を追加することで、メソッドを実行できるようになりました。
var validationResults = new HashSet<ValidationResult>();
var isValid = Validator.TryValidateObject(model, new ValidationContext(model, null, null), validationResults, true);
検証メソッドをValidator.TryValidateObject
呼び出し、最後のパラメーターを設定してtrue
すべてのプロパティを検証するようです。validationResults
ただし、意味のある方法で使用できるように、コントローラーにを取得することにこだわっています。