Лучший способ справиться с множественной проверкой формы в ASP.NET MVC - PullRequest
2 голосов
/ 28 сентября 2010

Обзор

У меня есть страница оплаты, где я разрешаю пользователю выбрать способ оплаты, либо кредитной картой, либо чеком. У меня есть форма для каждого из этих способов оплаты. Я не хотел создавать отдельную страницу для каждого из этих методов в целях пользовательского интерфейса, поэтому я использую [div] для каждой формы и переключаю их отображение с помощью jQuery.

Задача

Каждый из способов оплаты имеет свой собственный набор правил проверки. Я хочу иметь возможность применить проверку модели только к тому способу оплаты, который был выбран и отправлен пользователем. Чтобы выполнить проверку, я должен выполнить POST для одного и того же действия контроллера, поэтому отправка в разные действия не является опцией.

Подходы

Я рассмотрел следующие подходы:

  1. Частичная проверка на основе входящих значений, как описано здесь: http://blog.stevensanderson.com/2010/02/19/partial-validation-in-aspnet-mvc-2/. Моя проблема с этим подходом связана с безопасностью, и, поскольку это относительно небольшое приложение, у меня нет отдельного доменного слоя в качестве Автор статьи предлагает.
  2. Создайте отдельные модели для каждого метода оплаты, а затем перегрузите действие контроллера [HttpPost] другим параметром модели. Я пробовал это, но компилятор жалуется, что действие неоднозначно, хотя у меня что-то вроде этого

    [HttpPost]
    public ActionResult Pay (модель CreditCardPaymentModel) {...}

    [HttpPost]
    public ActionResult Pay (модель CheckPaymentModel) {...}

  3. Используйте отдельные действия контроллера для обработки отдельных сообщений формы и используйте TempData для установки сообщений проверки и перенаправления обратно на страницу формы для отображения сообщений. Мне действительно не нравится эта опция, так как она кажется неуклюжей, и я не люблю использовать TempData для чего-либо, кроме простых сообщений.

Буду рад любым предложениям о том, как лучше и эффективнее справиться с такой ситуацией.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2010

Я бы выбрал стратегию 3.

Когда вы переключаете представления формы с помощью jQuery, вы также можете заменить почтовый URL формы.Таким образом, он может легко обрабатываться различными методами контроллера, каждый из которых имеет свою собственную логику проверки.

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

PS С # 2 трудно сказать, какая модель будет работать до тех пор, пока каркас не попытается создать один экземпляр, и если он не сможет выполнить другой,Это не совсем просто, и структура была построена не для того, чтобы быть такой умной и привнести некоторую инициативу в процесс.

0 голосов
/ 28 сентября 2010

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

Вариант 2 также будет легко объединитьтест ...

...