Это не имеет никакого смысла для меня.
Посмотрите на эту ViewModel:
public class SelectService
{
[Required]
public int? SelectedServiceId { get; set; }
}
Посмотрите на это действие:
[HttpPost]
public virtual ActionResult SelectService()
{
TryUpdateModel(WizardContainer.SelectService, "SelectService");
TryValidateModel(WizardContainer.SelectService, "SelectService"); // if I remove this, ModelState.IsValid will always be true
if (ModelState.IsValid)
{
return RedirectToAction("OtherAction");
}
else
{
return View(WizardContainer);
}
}
Теперь прочитайте этот отрывок из Apress ASP.NET MVC 2 Framework от S. Sanderson:
Всякий раз, когда вы используете привязку модели для заполнения объекта модели - либо получая его в качестве метода действия
или путем вызова UpdateModel () или TryUpdateModel () вручную - тогда DefaultModelBinder будет
автоматически запускать валидаторы, связанные со всеми объектами модели, которые он обновил (т. е. те, где
установил значение хотя бы для одного свойства).
Если вы обновите объект модели любым другим способом, его валидаторы не будут запущены, если вы явно не укажете
рамки для их запуска.
Так почему же тогда проверка никогда не происходит, когда я вызываю TryUpdateModel ()? Чтобы получить подтверждение, я должен явно проверить с помощью TryValidateModel ().
UPDATE
Вот очень похожее действие в том же контроллере, которое работает, как и ожидалось:
[HttpPost]
public virtual ActionResult Index(string nextButton)
{
TryUpdateModel(WizardContainer.Index);
if (nextButton != null && ModelState.IsValid)
{
return RedirectToAction("OtherAction");
}
else
{
return View(WizardContainer.Index);
}
}
А вот это ViewModel:
public class Index
{
[Required]
public DateTime? SelectedServiceTime { get; set; }
}
Обновление 2
Я изменил некоторые вещи, и теперь он ведет себя так, как ожидалось, но я до сих пор не понимаю, почему.
Посмотрите на отредактированное действие:
[HttpPost]
public virtual ActionResult SelectService()
{
TryUpdateModel(WizardContainer.SelectService);
//TryValidateModel(WizardContainer.SelectService, "SelectService"); // not needed anymore
if (ModelState.IsValid)
{
return RedirectToAction("OtherMethod");
}
else
{
return View(WizardContainer.SelectService);
}
}
Разница заключается лишь в том, что объект, который я передаю в TryUpdateModel (), - это объект, который я передаю представлению, а не свойство объекта, который я передаю представлению. Что за сделка?