2014-10-05 2 views
0

Предположим, у меня есть следующие модели: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?

+0

Я подозреваю, что вы не делаете какие-либо элементов управления для недвижимости 'model2 .TestValue' –

+0

А если не так, что это значит? Я рендеринг текстового поля для TestValue, но для целей тестирования я удалил его с помощью Shift + CTRL + I. Я основал это, если я не буду инициализировать объект из конструктора, и если я положу [Обязательный] атрибут на Model2 внутри Model1, я получаю и model2 проверял, как это должно быть, но я не уверен, что это будет так, я обновлю мой вопрос, чтобы вы могли взглянуть на это. – MDDDC

ответ

0

Вы можете использовать IValidatableObject для проверки модели 2 независимо от того, является она нулевой или нет.

public class Model1 : IValidatableObject 
{ 
    [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 IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if (Model2 == null) 
      yield return new ValidationResult("Model2 is required", new { "Model2" }); 
    } 
} 
+0

Свойство 'Model2' инициализируется в конструкторе, поэтому оно не может быть нулевым! –

+0

Да, право, просто свойство равно null, объект инициализируется. – MDDDC

+0

Да @ StephenMuecke вы правы. –

 Смежные вопросы

  • Нет связанных вопросов^_^