0

ASP.NET MVC 3 の学習を始めたばかりです。ASP.NET Web サイトのミュージック ストアのサンプルを調べたり、独自のサイトの開発を開始したりしましたが、どのようにコントローラーアクションメソッドをセットアップする必要があります。

私のサイトでは、ログインしている各ユーザーがプロジェクトで標準の CRUD 操作を実行できます。ProjectController で次のアクション メソッドを使用して、ミュージック ストアのサンプルと同様にセットアップしました。これまでのところ、これは私にとって理にかなっています。

ActionMethod                                          View
ProjectController.Index()                            Lists the active users's projects
ProjectController.Details(int id)                    Shows details for project 123
ProjectController.Create()                           Shows a form to edit a new project
ProjectController.Create(FormCollection col)         Adds a new project with the form contents
ProjectController.Edit()                             Shows a form to edit a new project
ProjectController.Edit(int id, FormCollection col)   Adds a new project with the form contents
ProjectController.Deiete(int id)                     Shows a delete confirmation form
ProjectController.Delete(int id, FormCollection col) Deletes a project with the provided id.

さらに、ユーザーは各プロジェクトにアイテムを追加できます。アイテムは単独では存在できず、作成時にプロジェクトに関連付ける必要があります。理解に苦しんでいるのは、アイテムを作成する必要があるプロジェクトへの参照を渡す方法です。たとえば、私のアイテムコントローラーには、上記のコントローラーに似た Create() アクションメソッドのペアがあります。

ItemController.Create()                               Shows a form to create a new item
ItemController.Create(FormCollection col)             Creates a new item with the details from the form.

View() ヘルパー メソッドは 1 つのオブジェクト パラメーターしか受け入れられないため、最初の Create() メソッドが新しいアイテムを作成する必要があるプロジェクトへの参照を渡す方法がわかりません。プロジェクトへの参照を ViewBag のプロパティに追加するだけですか? 私は動的タイプも初めてで、ViewBag はその時点で魔法のように思えます。なので使うのはちょっと躊躇します。また、強く型付けされたデザインの方が優れていると常に考えてきました。では、新しいアイテムへの参照と追加先のプロジェクトを含む別の「NewItemData」モデル オブジェクトを作成する必要がありますか?

フォームが項目を追加するプロジェクトを認識したら、送信時にこの情報をどのように返す必要がありますか? フォームに非表示の「ProjectID」フィールドが必要ですか? または、クエリ文字列にプロジェクト ID を含む URL にフォーム POST を返す必要がありますか?

www.mysite.com/Item/Create?ProjectID=1234 

最後に、各プロジェクトに追加されたアイテムを一覧表示できるようにしたいと考えています。これは ItemController または ProjectController の一部である必要があります。簡単にするために、デフォルトの Controller\Action[ID] URL ルーティングに固執しています。私のアイデアのいくつかを以下に示します。私は最後のオプションに傾いていますが、このことについてより多くの経験を持つ他の人がどう思うかを本当に聞きたいです.

Action Method                          URL
ItemController.Index(int ProjectID)    \Item?ProjectID=1234    
ItemController.List(int id)            \Item\List\1234         
ProjectController.Items(int id)       \Project\Items\1234
4

2 に答える 2

0

この場合、 で非表示フィールドをname=projectId作成し、Create コントローラーにアクション メソッドを作成します。

[HttpPost]
public ActionResult Create( int projectId, FormCollection postData )

通常、強く型付けされたビューモデルも使用するため、代わりに FormCollection パラメータを使用します。

[HttpPost]
public ActionResult Create( int projectId, Item or ItemViewModel postData )

また、属性が Item または ItemViewModel のプロパティと一致する限り、nameMVC の ModelBinder がそれらの値のハイドレートを処理します。

于 2011-04-16T22:00:10.947 に答える
0

最後の質問に答えるには、場合によって異なります。モデル内のアイテムはプロジェクトとは独立して存在しますか? 答えが「いいえ」の場合、私はそうする傾向があります

ProjectController.AddItem(int id)
ProjectController.Items(int id)

ここで、id は projectID を表します。

アクション シグネチャで使用するパラメータの名前は、ルートデータの値とリクエスト値に直接対応しています。{controller}/{action}/{id} は、中かっこで囲まれた名前をルート ディクショナリのキーとして使用するパターンです。必要に応じて、そのアクションのルートを {controller}/{action}/{projectid} に変更し、メソッドの署名を (int projectid) 署名にすることができます。

素晴らしい署名を取得するためだけにこれを行うことはお勧めしません。人々が混乱すると思われる場合は、代わりにコメントを使用してください。

ルート パターンを変更せずに、URL を /project/items/3 よりも /project/items?projectid=3 にしたい場合、アクションは次のようになります。

ProjectController.Items(int projectId)

私はきれいな URL が好きなので、id バージョンを使用する傾向があります。そうは言っても、Items が Project オブジェクトとは独立して存在しない場合は、これを行う可能性が高くなります。ただし、Item に対して実行できるさまざまなアクションが大量にある場合は、それらを ItemController と ProjectController に分けるのが理にかなっています。

アプリケーションにとって何が理にかなっているのか、そしてコントローラーがアプリケーションに対していくつのアクションを実行する必要があると考えるかについては、大部分が当てはまります。

于 2011-04-16T23:00:26.127 に答える