2

フォーム レイヤーDB モデル レイヤー(エンティティ フレームワーク)、およびこの 2 つのレイヤーの間にコントローラー レイヤーを含む .net アプリケーションがあります。

私はこの状況を処理する必要があります:

  1. ユーザーがボタンを押していくつかのパラメーターを編集する

  2. フォームは、これらのパラメーターの現在の状態を表す DB データを要求する必要があります。

    • おそらく、現在の状況に該当しないため、ユーザー要求が拒否される可能性があります。この場合、エラー メッセージ ボックスが表示されます。
  3. モーダル フォームが表示され、ユーザーがパラメーターを変更して確認する

  4. DB モデルに変更が加えられる

それはとても簡単です。

実際のところ、ポイント 4 では、ポイント 2 ですでに処理したデータの一部が必要です。

特に:

  • ポイント 2 で、DB モデルにデータをリクエストします。そのデータはキャッシュにない可能性が高いため、SQL クエリが実行されます。
  • そのデータはローカル LINQ によって処理されます
  • モーダルフォームに表示するいくつかのチェックボックスの状態が返されます

  • ポイント 4 では、LINQ で処理されたデータが再び必要になります

  • Formレイヤーから来たので、そのデータはもうありません
  • したがって、データは DB モデルに再度要求されますが、今回はキャッシュにあります
  • そのデータはローカル LINQ によって再度処理されます

MVC パターンを維持するためにデータを再ロードして再処理する価値はありますか?

4

2 に答える 2

3

VB.NET で正確にどのように機能するかはわかりませんが、この問題を純粋な「MVC」の方法 (少なくとも、私が理解している方法) で見ると、何かが正しくありません。

  1. このステップでは、クリックが完了すると、フォームがコントローラーを呼び出します (すべてのアクションはコントローラーを通過します)。
  2. 次に、コントローラーは検証を行う必要があります。それを行うためにデータベースが必要な場合は、そうしてください。次に、ユーザーをビューにリダイレクトします。(メッセージボックスか、データを入力する別のフォームである必要があります)
  3. ここで、ユーザーはフォームで変更を行い、ボタンをクリックして送信します。このボタンでは、コントローラーを再度呼び出します (別の関数/アクション)。
  4. コントローラーでは、必要な検証を行い、LINQ を介してデータベース内のデータを挿入/更新できます。次に、ビューにリダイレクトできます。

ステップ 2 とステップ 4 の間にかなりの時間が経過した可能性があり、2 回の呼び出しの間でデータが変更された可能性があるため、リクエストを 2 回実行しても問題ないと思います。また、コントローラーの2つの異なる機能であるため、選択の余地はないと思います.

それは私がそれを見る方法ですが、私は間違っている可能性があります:)

編集

データベースへのクエリに時間がかかり、それが問題であることを知りませんでした。このアプリケーションでは時間が重要であるため、絶対的な目標がユーザーを2回待たせないことである場合、オブジェクトを保存できると思います。ステップ2でメモリ内に取得し、コントローラーで取得します(ある種のヘルパークラスを使用)。これは、データベースでクエリを実行するようなものですが、メモリ内で実行されます。リポジトリ パターンを使用する場合、コントローラーでロジックをコーディングしているプログラマーは、別のレベルの抽象化であるため、データベース以外のものをクエリしていることさえ知りません。手順 4 の直後にメモリを解放できます。

于 2013-03-11T15:49:23.797 に答える
0

ああ、100%確信はありませんが、あなたの質問のフローパターンは正しく見えませんか?

通常の手順は、データを表示し、データビューに編集ボタンを配置することです。

だからあなたは次のようなものを持っているかもしれません

Function ShowAddressDetails(OwnerId as long) as ActionResult

そして、ActionResultは通常、VIEWに渡されるモデルです(アドレスレコードのサンプルを保持します)...

Return View(AddressRecordModel)

ここで、アドレスレコードはOwnerIdパラメータを使用してSQLDBから抽出されます

そして、あなたの編集ボタンがあるあなたのビューでは、あなたは少なくとも2つの選択肢があります、それらは

1. Reload data from SQL (used where data may have changed since last action)
2. Pass the already loaded Model (Used where the data hasnt changed)

これは、次のいずれか(または両方)があることを意味します

Function EditAddressDetails(OwnerId as long) as ActionResult

また

Function EditAddressDetails(Model as AddressRecordModel) as ActionResult

または、「ACTION」ではなく「CHILDACTION」を使用することもできます。

また、次のことも忘れないでください... HTTP GETリクエストでは、モデルはCONTROLLERからVIEWに渡されます。HTTPPOSTリクエストでは、モデルはVIEWからCONTROLLERに渡されます。したがって、実際にモデル(データ)が必要です。 ?

最後に、シーケンスが1人のユーザーによってのみ使用される場合、データは要求間で変更されていないはずであり、EDIT / AMEND/UPDATE要求は正常に完了しました。

于 2013-03-14T01:25:23.677 に答える