Повторная проверка модифицированной ViewModel в методе контроллера?
EDIT. Мы используем MVC4 Dev Preview....
Я реализую страницу редактирования для класса FishingTrip
. FishingTrip
содержит дочернюю коллекцию простых объектов Crew
(т.е. FishingTripID, CrewID, CrewPosition).
Я использую подход Jarrett Meyer для добавления, редактирования и удаления из коллекции Crew
.
Я использую ненавязчивую проверку, чтобы указать, что свойства Crew
- все Required
.
Моя проблема: когда я логически удаляю элемент из списка (в соответствии с методом Jarrett), я не хочу, чтобы этот элемент проверялся.
Я успешно настроил метод removeRow на стороне клиента, чтобы отключить ненавязчивую проверку для логически удаляемого элемента, чтобы форма была опубликована, несмотря на наличие элемента, который содержит пустые поля.
В моем методе контроллера [HttpPost] Edit
ModelState.IsValid
начинается как false (как и ожидалось - из-за логически удаленного элемента, который содержит пустые поля.) Поэтому я удаляю этот элемент из моего ViewModel.... но ModelState.IsValid
все еще ложно.
Итак, я (думаю, я) хочу изменить свой ViewModel в методе контроллера, чтобы удалить оскорбительный элемент, а затем вызвать какой-то "revalidate" и показать ModelState.IsValid
как истину.
Любые идеи?
Ответы
Ответ 1
Как только вы удалили оскорбительный элемент (ы), очистите ModelState и повторите проверку, например:
ModelState.Clear();
TryValidateModel(crew); // assumes the model being passed is named "crew"
Примечание. Будьте осторожны при использовании метода TryValidateModel
, потому что этот метод не проверяет вложенный объект модели (как упоминалось @Merenzo).
Ответ 2
Поздно к игре, но все же:
Я также искал способ проверить модель после делать некоторые изменения (точнее - к элементам ее вложенной коллекции) - и TryValidateModel
не работал у меня, так как он не работает Не обрабатывать вложенные объекты.
Наконец, я установил привязку к пользовательской модели:
public class MyItemModelBinder : DefaultModelBinder
{
protected override void OnModelUpdated(
ControllerContext controllerContext,
ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(MyItemModel))
{
MyItemModel item = (MyItemModel)bindingContext.Model;
//do required tweaks on model here
//(I needed to load some additional data from DB)
}
//validation code will be called here, in OnModelUpdated implementation
base.OnModelUpdated(controllerContext, bindingContext);
}
}
в классе модели:
[ModelBinder(typeof(MyItemModelBinder))]
public class MyItemModel : IValidatableObject
{
//...
}