У меня есть модель представления, которая реализует 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
контроллеру, чтобы их можно было использовать осмысленно.