Повторная проверка модифицированной ViewModel в методе контроллера? - PullRequest
53 голосов
/ 20 октября 2011

РЕДАКТИРОВАТЬ - Мы используем MVC4 Dev Preview ....

Я реализую страницу редактирования для класса FishingTrip.FishingTrip содержит дочернюю коллекцию простых Crew объектов (т.е. FishingTripID, CrewID, CrewPosition).

Я использую подход Джарретта Мейера для добавления, редактирования и удаления из коллекции Crew.Я использую ненавязчивую проверку, чтобы указать, что все свойства Crew Required.

Моя проблема: когда я логически удаляю элемент из списка (согласно методу Джарретта), я нея хочу, чтобы этот элемент был проверен.

Я успешно настроил метод «removeRow» на стороне клиента, чтобы отключить ненавязчивую проверку для логически удаленного элемента, чтобы форма публиковалась, несмотря на наличие элементакоторый содержит пустые поля.

В моем методе контроллера [HttpPost] Edit, ModelState.IsValid начинается как ложное (как и ожидалось - из-за логически удаленного элемента, который содержит пустые поля). Поэтому я удаляю этот элемент из моей ViewModel ....но ModelState.IsValid все еще ложно.

Таким образом, я (думаю, что) хочу изменить мою ViewModel в методе контроллера, чтобы удалить вызывающий беспокойство элемент, затем вызвать некоторый тип "revalidate", и ModelState.IsValid отобразиться как true.

Есть идеи?

Ответы [ 2 ]

125 голосов
/ 20 октября 2011

После того, как вы удалили вызывающий (-ые) предмет (-ы), очистите ModelState и подтвердите снова, например:

ModelState.Clear();
TryValidateModel(crew);  // assumes the model being passed is named "crew"

Примечание : будьте осторожны при использовании метода TryValidateModelэтот метод не проверяет вложенный объект модели (как упомянуто @Merenzo).

2 голосов
/ 16 марта 2015

Поздно к игре, но все же: я также искал способ проверить модель после того, как сделал несколько настроек для нее (точнее - для элементов ее вложенной коллекции) - и 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
{
    //...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...