2012-04-12 16 views
2

私の究極の質問はこれです - モデルバインダーはモデルのすべての、または投稿されているビットのみを残して残りの部分を設定する必要がありますか?MVCモデルのプロパティ

たとえば、私は自分のシステムとフォームに製品を追加していますが、ユーザーは新製品がどのサイトに表示されるかを選択する必要があります。したがって、私のモデルでは、AllAvailableSitesという名前のコレクションを設定して、ユーザーが選択できるようにするためのチェックボックスを表示したいと考えています。フォームが検証されない場合は、選択したサイトを投稿に追加してモデルを作成する必要があり、最初の選択を示すフォームを表す必要があります。モデルバインダーにモデル上の選択されたサイトを設定させ、(コントローラーメソッドでは)モデル上に「AllAvailableSites」を設定する必要があるようです。それは正しいと思いますか?モデルバインダーですべてを設定する方が効率的だと思われますが、誰かがそれが正しくないと示唆しています。

私はアドバイスをいただき、ありがとうございます。私は、MVCのモデルバインディングのすべてのヘルプは、本当に簡単な例を引用しているようで、何も複雑ではないと言わざるを得ない。

また、実際にはGETメソッドとPOSTメソッドが必要ですか?同じビューモデルを使うことはできませんか?次に、GET/POSTの場合はモデルバインダーをチェックインし、それに応じてすべてのモデルを設定します。

+0

実際に何かがGETされたのか、POSTされたのかを実際に伝えることはできますか?編集:はいできますhttp://stackoverflow.com/questions/8629624/how-can-i-tell-if-a-method-is-a-result-of-a-get-or-a-post-from -inside-my-mvc-actまだ恐ろしいアイデアです。 – glosrob

+0

GETメソッドとPOSTメソッドを投稿できますか? – mattytommo

答えて

0

あなたの最初の結論は健全です。モデルバインダーは、モデルのインスタンスを作成し、そのプロパティにアクションコンテキスト(たとえば値を設定)から使用可能な値を設定し、検証を実行することについてのみ心配する必要があります。コントローラは、使用可能なサイトのリストなど、ビューに必要な追加の値を入力する必要があります。

個別のGET/POSTメソッドが必要であるということをどういう意味なのかよく分かりません。モデルのインスタンスを保存したり作成したりする場合は、投稿する必要があります。そのため、GETパートは無関係です。あなたが何かを意味しない限り:

[HttpGet, ActionName("Edit")] 
public ActionResult Edit(MyModel model) 
{ 
    return View(model); 
} 

[HttpPost, ActionName("Edit")] 
public ActionResult SaveEdit(MyModel model) 
{ 
    // validate and save, then 
    return View(model); 
} 

をあなただけのワンアクションにそれらを結合し、それらが編集フォームを表示したり、アクション内の編集フォームの結果を掲載している場合だけを見つけ出すことができればおそらく、あなたが思っています。私はあなたにこれをしないことを強く勧めます。さまざまな理由がありますが、そのままにしておきましょう。それをしないでください。

+0

ありがとうございます。ちょうど明確にするために、別のGET/POSTメソッドを使って、GETまたはPOSTのときに編集用に別のコントローラメソッドを使用することで何をしたのかを意味していました。あなたのGETバージョンの編集メソッドについては、GETであってもモデルバインダークラスを通して実行されるモデルインスタンスが必要ですが、何も入力されていないので、私はそのGET/POST私のモデルのバインダーで、そこにないものをチェックする手間を省けますか?次に、コントローラーを推測して、エンティティをモデルバインダーではなくDBからロードしますか? – Richard

+0

できますが、する必要はありません。値を持たないプロパティをスキップする必要があります。バインダーは、通常、フォームポスト、JSONポスト、クエリ文字列引数などの値を解析できるValueProviderを使用します。バインダーは、モデルの適切なプロパティをすべて通過し、ValueProviderから値を取得しようとします。それがなければ、それをスキップする必要があります。 – HackedByChinese

+0

うーん、私のモデルのバインダーにRequest.Formをチェックするだけだった。私のフォームは非常に複雑で、コントロールのほとんどは複製されます(つまり、私の製品が3つのサイトに表示される場合、その説明はそれぞれ異なるため、私のフォームには3つのコントロールがありますDescription_Site1、Description_Site2などと呼ばれます)。サイトの数はさまざまであるため、モデルには単純なプロパティがあり、リストが必要です。また、後で追加された行を追加することができるページの後ろに表示されるグリッドを持っている - 私はちょうどdefaultmodelbinderを信頼しないでください....私は? – Richard

関連する問題