2

概要

ユーザーがクレジットカードまたは小切手のいずれかの支払い方法を選択できる支払いページがあります。これらの支払い方法ごとにフォームがあります。UI の目的でこれらのメソッドごとに個別のページを作成したくなかったので、フォームごとに [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 を使用するのも好きではありません。

このような状況をクリーンかつ効率的に処理するための最善の方法についての提案を歓迎します.

4

2 に答える 2

0

オプション 2 を使用します。これにより、支払いモデルと具体的なモデル クラスが明確に分離されます (私は常に強く型付けされたソリューションを使用します)。

オプション2も単体テストが簡単になります...

于 2010-09-28T13:24:08.457 に答える
0

私は戦略3に行きます。

フォーム ビューを jQuery で切り替えると、フォームの投稿 URL を置き換えることもできます。このようにして、それぞれ独自の検証ロジックを持つさまざまなコントローラー メソッドで簡単に処理できます。

もう 1 つのオプション (私が好きなものではありません) は、両方の支払いオプションの統合モデルを作成することです。そのモデルをインスタンス化すると、おそらくどのフォームがアクティブだったかを簡単に見分けることができます。または、jQuery で非表示の値を設定して、アクティブなフォーム ビューを示すこともできます。

PS #2では、フレームワークがインスタンス化を試みるまで、どのモデルのインスタンス化がうまくいくかを判断するのは困難です。これは簡単なことではなく、フレームワークはそれほどインテリジェントで、プロセスにイニシアチブをもたらすようには構築されていません。

于 2010-09-28T13:25:40.513 に答える