ModelState не проверяет вложенные модели после редактирования в контроллере
у меня есть вложенные ViewModels, как эти два:
public class FirstViewModel
{
public SecondViewModel SecondViewModel { get; set; }
}
public class SecondViewModel
{
[Range(1, 12)]
public int month { get; set; }
}
если я ставлю month = 13;
и затем вызов ModelState.IsValid
(в контроллере) проверка всегда true
.
Edit:
это контроллер:
public ActionResult Create()
{
return PartialView(new FirstViewModel);
}
public HttpStatusCodeResult Create (FirstViewModel viewModel){
viewModel.SecondViewModel = new SecondViewModel();
viewModel.SecondViewModel.month = 13;
if (ModelState.IsValid)
{
return new HttpStatusCodeResult(200);
}
else
{
return new HttpStatusCodeResult(304);
}
}
я делаю абстракцию проблемы,это не реальные переменные.
3 ответов
ваш вопрос утверждает, что вы " вызов ModelState.Проверить" в вас контроллер. Такого метода нет, поэтому я предполагаю, что вы имеете в виду if (ModelState.IsValid)
.
первый шаг в процессе привязки модели заключается в том, что параметры вашего метода инициализируются, в вашем случае новый экземпляр FirstViewModel
. Затем значения модели устанавливаются на основе данных формы, значений маршрута,значений строки запроса и т. д. и любые ошибки проверки, связанные со свойствами вашей модели, добавляются в ModelState
.
последующее изменение значения свойств в вашей модели не влияет на ModelState
, поэтому, если начальное значение month
действителен, то ModelState.IsValid
возвращает true, независимо от настройки viewModel.SecondViewModel.month = 13;
если вы хотите повторно проверить свою модель, вам нужно использовать TryUpdateModel возвращает bool
указывает, если обновление удалось
public HttpStatusCodeResult Create (FirstViewModel viewModel)
{
viewModel.SecondViewModel = new SecondViewModel();
viewModel.SecondViewModel.month = 13;
if (TryUpdateModel(viewModel)
{
return new HttpStatusCodeResult(200);
}
else
{
return new HttpStatusCodeResult(304);
}
}
поскольку свойство SecondViewModel класса FirstViewModel равно null,оно не будет проверяться. Попробуйте добавить обязательный атрибут к свойству:
public class FirstViewModel
{
[Required]
public SecondViewModel SecondViewModel { get; set; }
}
public class SecondViewModel
{
[Range(1, 12)]
public int month { get; set; }
}
редактировать
основываясь на вашем обновлении, я согласен с @StephenMuecke. Вы не можете создать экземпляр класса самостоятельно и ожидать, что платформа проверит его для вас. TryUpdateModel - это то, что вы ищете в этом случае, или вы должны позволить фреймворку создать экземпляр класса для вас. Вы должны сдать в SecondViewModel.месяц=13 где-то в вашем запросе, чтобы увидеть это в действии.
вы можете проверить модель в любое время с помощью этой
Validator.TryValidateObject().
или, только для одного свойства, см. этой
Validator.TryValidateProperty()
пусть у вас есть адрес класса
public class Address
{
[Required]
public string Address2 { get; set; }
[Required]
public string ZipCode{ get; set; }
}
вы можете использовать этот фрагмент для проверки Вашего объекта. Все ошибки будут в" результатах " varibale.
var addresse = new Address() { Street = null, ZipCode = null};
var context = new ValidationContext(addresse, null, null);
var results = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(addresse, context, results, true);