我有一个实现的视图模型,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
好吧,看来我离得更近了一点。我现在可以IValidatableObject
通过将以下内容添加到我的自定义模型绑定器来运行我的方法:
var validationResults = new HashSet<ValidationResult>();
var isValid = Validator.TryValidateObject(model, new ValidationContext(model, null, null), validationResults, true);
似乎Validator.TryValidateObject
调用验证方法并将最后一个参数设置为true
使其验证所有属性。但是,我现在坚持使用validationResults
控制器,以便可以以有意义的方式使用它们。