0

私はちょうど本から例を得た

コントローラ:

[HttpPost]
public ViewResult RsvpForm(GuestResponse guestResponse)
{
   // TODO: Email guestResponse to the part organizer
   return View("Thanks", guestResponse);
}

意見:

@model MvcApplication1.Models.GuestResponse 
@{
    ViewBag.Title = "Thanks";
}
<div>
    <h1>Thank you, @Model.Name!</h1>

    @if (Model.WillAttend == true)
    {
        @:It's great that you're coming. The drinks are already in the fridge!
    }
    else
    {
        @:Sorry to hear that you can't make it, but thanks for letting us know.
    }
</div>

このアプローチは、ビューとモデル/コントローラーロジックを分離するという概念に反していると思います。

私のアプローチは次のとおりです。

コントローラ:

  [HttpPost]
    public ViewResult RsvpForm(GuestResponse guestResponse)
    {
        ViewResult v = View("Thanks");
        v.ViewBag.Name = guestResponse.Name;

        if (guestResponse.WillAttend)
        {
            v.ViewBag.Message = "It's great that you're coming. The drinks are already in the fridge!";
        }
        else
        {
            v.ViewBag.Message = "Sorry to hear that you can't make it, but thanks for letting us know.";
        }

        return v;
    }

意見:

@{
    ViewBag.Title = "Thanks";
}
<div>
    <h1>Thank you, @ViewBag.Name!</h1>

    @ViewBag.Message;

</div>

この「質問」の目的は、表示にはビューを使用し、何を表示するかを制御するにはコントローラーを使用する必要があること、および書籍の例は「悪いアプローチ」であることを明確にすることです (著者が単に能力を示したかったという事実を考慮しています)。 MVCの)

厳密に型指定されたビュー (ロジック コードを含む) を使用することは本当に良いアイデアですか、それとも ASP スパゲッティ コードのようなものに戻るのでしょうか?

高品質のエンタープライズ デザインを考慮して、いくつかの良いフィードバックをお願いします。

更新: 些細な例であることはわかっていますが、検証などはありませんが、(この例のために) モデルにロジックを配置し、ビューで次のような結果にアクセスすることをお勧めします。

@Model.Message
4

3 に答える 3

3

関心の分離とは、それ自体を結合することではなく、誰が何を担当しているかを明確にすることです。コントローラーで UI 要素を作成することは関心の分離に違反しますが、データを入力することは違反しません。必然的に、コントローラーとビューの間に必要な結合がいくつかあります。結局、コントローラ アクションは、ビューが UI を生成するために使用するデータを提供する必要があります。一般的に、MVC を実行するときは、強く型付けされたビューとビューごとのモデルを好みます。これにより、ビュー コードで厳密に型指定されたデータの利点が得られます。実際には、通常、横断的な関心事のためにいくつかの ViewBag データと結合された、厳密に型指定されたビュー モデルが混在しています。

ビューでロジックを使用する限り、「場合による」と言えます。個別のビュー、(モデル データに基づいて) いくつかのパーシャルから選択するビュー、HTML バリアントを選択するためのフロー制御を使用しました。どの方法を選択するかは、モデル/ビュー間の違いによって異なります。ロジックが UI 表示の選択のみに関するものである場合は、それをビューに残しておくことに問題はありません。私はむしろそれを持っていて、選択肢をコントローラーに押し戻したいと思っています。それは関心の分離に違反します。

于 2013-01-21T22:46:50.960 に答える
2

ビュー内でコードを使用することは、厳密に型指定されたビューを持つことと同じではありません。どちらか一方がなくても簡単に使用できます。厳密に型指定されたビューにはいくつかの利点があり、それ自体が関心の分離に違反しているわけではありません。

ビュー内で分岐コードを使用すると、コード臭がする可能性があり、実際には関心の分離に違反する可能性がありますが、それは実際にはコードが何をしようとしているのかによって異なります。あなたが提示した場合、ビューで使用される文字列は厳密に表示目的で存在するため、違反ではないと主張します。

于 2013-01-21T22:46:30.077 に答える
1

tvanfosson が簡潔に説明したように、関心の分離は、コントローラーとビューの分離から生じます。

Web フォームや ASP Classic とは対照的に、MVC アーキテクチャは論理層 (コントローラー) をプレゼンテーション層 (ビュー) から分離します。それぞれのコードが別々の場所にある限り、懸念事項の分離を実現しています。

モデルは、分離されたレイヤーから情報を渡すための受動的な媒体です。モデルを強く型付けすると、2 つの間の「契約」が強化されますが、分離に違反することはありません。ビュー コードに再度アクセスすることなく、データ アクセス方法を ADO から ORM に進化させることができます。ビューをまったく変更せずに、ORM をリファクタリングして Web サービスを使用することができます。

ビューの着信値または発信値を変更することにした場合にのみ、ビューを変更する必要があります。そして、それは本質的に、関心の分離です。

于 2013-01-21T23:14:04.180 に答える