1

私はまだ MVC プログラミングの方法を学んでいますが、コントローラー内の Get および POST ActionResult 関数に関して 1 つのことを明確にするために 1 つの質問があります。考えられる 3 つのシナリオ (実際には 3 つの質問) を示します。

私の最初のシナリオ:

public ActionResult Derp()
{
    Derpina derpina = new Derpina(); //Should I need to pass this to View?
    return View(derpina);
}

[HttpPost]
public ActionResult Derp()
{
    Derpina derpina = new Derpina();
    UpdateModel(derpina);
    //doStuff and save to DB
    return RedirectToAction("Index");
}

私の2番目のシナリオ:

public ActionResult Derp()
{
    return View();
}

[HttpPost]
public ActionResult Derp()
{
    Derpina derpina = new Derpina(); //Is this the cleanest way?
    UpdateModel(derpina);
    //doStuff and save to DB
    return RedirectToAction("Index");
}

私の 3 番目のシナリオ:

public ActionResult Derp()
{
    Derpina derpina = new Derpina();
    return View(derpina);
}

[HttpPost]
public ActionResult Derp(Derpina derpina)
{
    UpdateModel(derpina); //Should I need to do that at all?
    //doStuff and save to DB
    return RedirectToAction("Index");
}

新しいエンティティを作成してビューに渡す必要がないため、2 番目のシナリオに傾いています。私はそれが私が皆さんに尋ねている理由だと思います.誰かが私に「ばかげた質問」はないと言ったので、あなたが私に耐えてくれることを願っています:)

  1. 新しく作成した Derpina をビューに渡す必要がありますか
  2. 2 番目のシナリオは「ベスト プラクティス」ではないでしょうか。
  3. 3 番目のシナリオで、Derpina をパラメーターとして HttpPost 関数に渡すと、MVC フレームワークはまだモデルを更新していませんか?

英語は私の母国語ではないので、これらの質問が意味をなすことを願っています. とにかく、あなたが私に明確にするために私に与えることができるどんな助けにも前もって感謝します.

編集済み

私が受け取った1つの回答の後、4番目のシナリオを追加したいと思います:

public ActionResult CreateDerp()
{
    return View();
}

[HttpPost]
public ActionResult CreateDerp(Derpina derpina)
{
    UpdateModel(derpina);
    //doStuff and save to DB
    return RedirectToAction("Index");
}

GET関数でモデルをビューに送信する必要がない場合、それは正しいアプローチでしょうか? たとえば、上記のコードが示すように Create 関数を使用していた場合。

4

2 に答える 2

3

1 番目の質問 -> データベースからのデータを表示する必要があるビューがある場合は、モデルをビューに送信して、ページに目的のデータを表示できるようにする必要があります。

2番目の質問->ポストメソッドでモデルをパラメーターとして取得する必要がない場合は、ポスト時に常に推奨されます。これがモデルバインダーの全体的な目的です。データベース内のデータを更新する方法は、ビジネスで分離する必要があります私の意見では、それが最もクリーンな方法です。

3番目の質問-> mvcフレームワークは実際にビューからのデータを含む新しいモデルを作成しました(ユーザーが入力した場合)が、オブジェクトを自動的に更新したり、データベースに変更を適用したりするわけではありません。明示的に、必要な方法で。

少しでもお役に立てれば幸いです。

于 2012-09-05T16:51:55.030 に答える
1

質問1:いくつかの値を初期化する場合(コンストラクターなど)にのみ、新しいインスタンスをビューに渡す必要があります。

質問2:Derpinaの新しいインスタンスを作成する場合、ユーザーが入力した値は取得されません。シナリオ3のように、DerpinaのインスタンスをDerpメソッドに渡す必要があります。

質問3:を呼び出す必要はありませんがUpdateModel()、モデルの状態(ModelState.IsValid)を確認してから、ビジネスロジックを実行し、モデルをデータベースに保存する必要があります。

于 2012-09-05T17:53:33.477 に答える