Фон
У меня есть страница оплаты, где пользователь может выбрать из списка существующих способов оплаты или указать новый. В раскрывающемся списке представлены такие параметры, как:
- Visa - * **** * 1234 (Сохранено)
- Mastercard - * **** * 9876 (сохранено)
- [Новая кредитная карта ...]
- [Новый электронный чек ...]
Используя jQuery, я переключаю скрытые DIV, содержащие либо информационную таблицу (в случае вариантов 1 или 2 для сохраненных способов оплаты), либо форму (в случае [новых] параметров).
Я использую строго типизированный класс в качестве модели представления, которая содержит (среди простых типов) класс CreditCard и класс Check. Каждый из этих классов использует валидаторы аннотаций данных, так как они используются в других частях сайта.
Проблема
Проблема возникает, когда пользователь отправляет форму. Я хотел бы использовать привязку модели для обработки сопоставления значений POST, но мне нужно, чтобы привязка и / или проверка срабатывала в зависимости от того, какой вариант выбрал пользователь. Например, если пользователь выбирает вариант 1 или 2 из приведенного выше списка, я не хочу, чтобы проверка модели (или, возможно, даже сама привязка) срабатывала для объектов CreditCard или Check.
Я исследовал возможности создания настраиваемого связывателя модели с помощью IModelBinder, а также расширения DefaultModelBinder и простого переопределения некоторых методов. Однако я не уверен, какой метод лучше, и, если расширение DefaultModelBinder, будет подходящим методом для переопределения.
Логика была бы довольно простой:
- Если пользователь выбрал один из существующих способов оплаты, проверка кредитной карты или чека не требуется.
- Если пользователь выбрал один из вариантов для создания нового способа оплаты, то необходимо привязать и проверить только выбранный метод (кредитная карта или чек).
Кажется, что расширение DefaultModelBinder - это правильный путь, поскольку я хотел бы, чтобы основа выполняла большую часть тяжелой работы без необходимости создавать настраиваемое связующее с нуля. Однако, глядя на доступные методы для переопределения, неясно, какой из них лучший:
- BindProperty - проблема в том, что мне в основном нужно смотреть на одно из свойств, чтобы определить, какие другие свойства должны быть связаны. Я не думаю, что могу контролировать порядок, в котором привязываются входящие свойства, и не хотел бы полагаться на порядок, в котором они установлены в HTML-форме.
- OnModelUpdated - К этому моменту уже слишком поздно. Была запущена проверка привязки из аннотаций к данным, и ModelState был обновлен. Мне пришлось бы перебрать ModelState и удалить несущественные ошибки.
- OnPropertyValidating - сначала я подумал, что это то место, где мне следует искать, но даже возврат TRUE для всех свойств (в качестве теста) приводит к тому, что ModelState содержит ошибки привязки.
Я встречал этот сценарий в других аспектах приложения и решил разделить функциональность на отдельные контроллеры / действия, чтобы упростить процесс. Однако я хотел бы лучше понять, как подходить к более сложным проблемам пользовательского интерфейса, особенно связанным с функциями привязки модели MVC.
Любая помощь по этому поводу будет принята с благодарностью.
Все возможные значения хранятся в раскрывающемся списке. Используя jQuery, я переключаю форму (для нового метода оплаты) и отображение (для существующего метода)