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);