UpdateModel без проверки

Есть ли возможность в ASP.NET MVC3 установить свойства модели представления из FormCollection без вызова проверки, указанной с помощью атрибутов проверки свойств? UpdateModel<T>(T model) также вызывает проверку.

Фон:

Я могу проверить модель только при наличии соединения с базой данных, но это соединение может быть установлено только в том случае, если данные из одного конкретного поля формы верны (своего рода код доступа для каждой организации). Если соединение не установлено, выдается исключение.

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

Так что мне нужно в основном что-то вроде условной проверки или отсутствия проверки связывателем модели вообще. Есть ли что-нибудь подобное, встроенное в ASP.NET MVC, или мне нужно написать собственный метод UpdateModel, вызывающий (настраиваемый) связыватель модели?


person Peter    schedule 30.07.2011    source источник


Ответы (1)


Почему бы не передать в метод модель представления, а не коллекцию форм? Таким образом вы можете сделать

[HttpPost]
public ActionResult Update(UpdateViewModel model)
{
    if (!Model.IsValid)
    {
        return View(model);
    }
}

Поэтому, если проверка не удалась, ваш пользователь будет направлен обратно в представление «Обновить», где модель уже будет заполнена на основе предоставленной информации.

Теперь, на мой взгляд, наличие атрибута проверки требует подключения к базе данных, которое, в свою очередь, может вызывать исключения, - это неправильный способ сделать это. Такого рода проверки я перехожу к службе проверки, которая вводится в контроллер (и принимает необходимые материалы репозитория через DI). Каждая служба проверки будет принимать модель представления и возвращать коллекцию экземпляров ValidationResult, которые я затем присоединяю к модели результат проверки с помощью метод расширения к классу Controller (оба взяты из материала Project Silk, который MS P&P выпускает)

Это упрощает тестирование, так как вы можете создать макет репозитория и заставить его возвращать правильные результаты для тестирования ...

person blowdart    schedule 30.07.2011
comment
Логика проверки (реализованная как атрибуты проверки) выдает исключение, если подключение к базе данных недоступно (что не так в данный момент). Итак, шаги следующие: 1. Проверить правильность значения fieldA - 2. Подключиться к базе данных на основе значения fieldA - 3. Обновить и проверить модель. Шаги 2 и 3 невозможны, если значение fieldA недопустимо. Конечно, я мог бы просто перехватить исключения, но это исключения, создаваемые EF, который сам скрыт за шаблоном репозитория. Так что это не было бы чистым решением. - person Peter; 31.07.2011
comment
А, ладно, тогда ты ошибаешься ухмылка Разверну свой ответ - person blowdart; 31.07.2011
comment
Спасибо за подробное объяснение. Вы имеете право на то, что общий дизайн может быть неоптимальным, но мой фактический вопрос был более целенаправленным, есть ли на самом деле способ обновить модель без проверки. Таким образом, я все еще ухожу, оставлю его открытым. Может кому придет в голову идея. - person Peter; 02.08.2011