Подтвердить что ты не робот

Повторная проверка модифицированной 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 как истину.

Любые идеи?

4b9b3361

Ответ 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
{
    //...
}