Предположим, у меня есть следующие модели:MVC 5.2 на стороне сервера проверки для второй модели уровня не работает, как ожидается
Model1:
public class Model1
{
[Required(ErrorMessageResourceType = typeof (Resource), ErrorMessageResourceName = "RequiredParameter")]
[Display(Name = "Name", ResourceType = typeof (Resource))]
public string Name { get; set; }
[Required(ErrorMessageResourceType = typeof (Resource), ErrorMessageResourceName = "RequiredParameter")]
[Display(Name = "Description", ResourceType = typeof (Resource))]
public string Description { get; set; }
public Model2 Model2 { get; set; }
public Model1()
{
Model2 = new Model2();
}
}
Model2:
public class Model2
{
[Required(ErrorMessageResourceType = typeof (Resource), ErrorMessageResourceName = "RequiredParameter")]
[Display(Name = "Name", ResourceType = typeof (Resource))]
public string TestValue { get; set; }
}
контроллер :
[HttpGet]
public ActionResult TestValidation()
{
var obj = new Model1();
return View(obj);
}
[HttpPost]
public ActionResult TestValidation(Model1 obj)
{
if (ModelState.IsValid)
{
return Content("valid");
}
return Content("Invalid");
}
Когда я пытаюсь проверить модель 1, у меня странное поведение.
Вы можете видеть, что все мои свойства имеют тип строки.
Я не знаю, почему модель проверена только для первого уровня, а не для второго уровня.
Если TestValue из Model2 имеет значение null, у меня есть ModelState.IsValid = true, но если у меня есть имя или описание из Model1 с нулевыми значениями, у меня будет ModelState.IsVlaid = false.
Похоже, что [Требуется] атрибут работает только для первого уровня (модель 1), а не для второго уровня (модель 2).
Почему у меня такое странное поведение?
UPDATE
public class Model1
{
[Required]
public string Name { get; set; }
[Required]
public string Description { get; set; }
public Model2 Model2 { get; set; }
}
public class Model2
{
[Required]
public string TestValue { get; set; }
}
Используя свою модель, как и выше я получаю подтверждение, как expected.Do мне нужно использовать, как и выше, чтобы получить работу и проверки для model2?
Я подозреваю, что вы не делаете какие-либо элементов управления для недвижимости 'model2 .TestValue' –
А если не так, что это значит? Я рендеринг текстового поля для TestValue, но для целей тестирования я удалил его с помощью Shift + CTRL + I. Я основал это, если я не буду инициализировать объект из конструктора, и если я положу [Обязательный] атрибут на Model2 внутри Model1, я получаю и model2 проверял, как это должно быть, но я не уверен, что это будет так, я обновлю мой вопрос, чтобы вы могли взглянуть на это. – MDDDC