1

「ListItem」ビューに表示されている既存のアイテムのコレクションに、別の「NewItem」ビューに入力された新しいアイテムを追加する必要がある場合に、アプリケーションシナリオを解決するための優れたデザインパターンはありますか?

たとえば、EF4.1コードファーストアプリケーションを備えたASP.NET MVC3は製品のリストを管理し、各製品には部品のリストが含まれています。EFモデルには、いくつかの基本的なタイププロパティを持つProductオブジェクトと、Partオブジェクトのコレクションが含まれています。

ユーザーは、新しい製品をリストに追加し、NewProductViewを開いて一般的な製品情報を入力し、その後、この新しい製品の部品のコレクションを入力できます。パーツ情報は別のNewPartビューに収集され、新しい製品の既存のパーツコレクションに含める必要があります。主な課題は、NewProductビューとNewPartビューの間を行き来しながら、このパーツの一時的なコレクションを永続化するためのベストプラクティスは何ですか?

1つのオプションは、新しいパーツレコードをすぐにデータベースに保存することですが、親のProductオブジェクトはまだ構築されておらず、複数のデータベース呼び出しが必要になります。理想的には、パーツのコレクションを含む完全な新しいProductオブジェクトを1回の呼び出しで保存する必要があります。別のオプションは、一時的なパーツコレクションストレージにセッションを使用することですが、これが適切なアプローチであるかどうかは確かです。現時点では、Ajaxやその他のクライアントサイトテクノロジーを使用せずに、ビューからサーバーへの標準的な取得/投稿を行うだけのデザインパターンに興味があります。

4

1 に答える 1

0

「理想的には、部品のコレクションを含む完全な新しい製品オブジェクトを 1 回の呼び出しで保存する必要があります。」個人的には ajax でこれを行います。Steve Sanderson のBeginCollectionItemおよび jquery UI ダイアログと組み合わせて使用​​すると、完全に可能で難しくありません。ただし、ajax を使用せずにこれを実現するには、次のようにします。

ユーザーは製品フォームから始めます。製品フォームには、現在のパーツの (空の) リストと [新しいパーツ] ボタンがあります。

ユーザーが [新しいパーツ] ボタンをクリックすると、アクション メソッドに完全なポストバックが送信されます (したがって、[新しいパーツ] ボタンは<input type="submit" name="TakeAction" value="New Part" />.

アクション メソッドは、どのボタンがクリックされたかを把握するためにリクエストを検査します。[新しいパーツ] ボタンがクリックされた場合、アクション メソッドはパーツ フォーム ビューを返します。

ただし、部品フォーム ビューには、製品フォームに入力できるすべてのスカラー フィールドの非表示フィールドが必要です。また、次のような送信ボタンがあります。<input type="submit" name="TakeAction" value="Add Part" />

Part フォームを送信すると、アクション メソッドは Product フォーム ビューを返します。ただし、現在のパーツのリストには、追加されたパーツと、前のパーツ フォームで入力されたそのパーツのすべてのスカラーの非表示フィールドが含まれています。(MVC2+ で HTTP POST を介してアイテムのリストを送信する方法の詳細については、このリンクこのリンクを参照してください。)

これは基本的に、ユーザーが複数回クリックしても状態を維持するために、viewstate が Web フォームで行うことです。バックグラウンドでは、以前のフォーム送信からのすべてのデータが、セッションまたは永続ストレージを使用せずに一連のポストバックに渡って運ばれます。MVC ではビューステートがないため、一連のポストバックを介してあるフォーム ビューから別のフォーム ビューに渡すには、より明示的に「他のフォームの」非表示フィールドを実際に書き出す必要があります。

ただし、製品フォームがより多くの「コレクション」プロパティを取得するとすぐに、これはすぐに手に負えなくなります。

他にできることは、製品と部品を作成するための漸進的開示/ウィザードのようなワークフローをユーザーに強制することです。最初に必要なすべての製品情報を入力するようユーザーに要求できます。次に、その製品が保存されたら、それらを別の画面にプッシュして、新しい部品を製品に追加することをループします。これにより、互いにデータをプッシュする、相互に依存するプリンシパル ビューと依存フォーム ビューのもつれた混乱から抜け出すことができます。

于 2012-04-09T21:47:11.627 に答える