2017-02-09 6 views
0

2つのアクションを持つコントローラが1つあります。MVCアプリケーションを適切に構築する方法

Entity Frameworkを使用してデータベースから要求のリストを取得し、ビューに表示する最初のアクションです。

@model List<Request> 
@foreach (var request in Model) 
{ 
    <tr> 
     <td> 
      @Html.DisplayFor(model => request.Id) 
     </td> 
     <td> 
      @Html.DisplayFor(model => request.Title) 
     </td> 
     <td> 
      @Html.DisplayFor(model => request.Message) 
     </td> 
     <td> 
      @Html.DisplayFor(mode => request.CreateDate) 
     </td> 
     <td>@Html.ActionLink("Reply", "SendResponse", new { id = request.Id })</td> 
    </tr> 
} 

そして、あなたはビューコードI出力でにユーザーを取るのリンクを見れば、最終的要求のためのモデルは

public partial class Request 
{ 
    public int Id { get; set; } 
    public string Title { get; set; } 
    public string Message { get; set; } 
    public System.DateTime CreateDate { get; set; } 
    public Nullable<bool> Responded { get; set; } 
} 

です:

public class HomeController : Controller 
{ 
    public ActionResult HelpRequests() 
    { 
     using (var context = new MyDbContext()) 
     { 
      var items = context.Requests.ToList(); 
      return View(items); 
     } 
    } 
} 

図でありますホーム/ SendResponse/id

これは私の不確実性が入る場所です。

SendResponseアクションの目的は、特定の要求に返信することです。 SendResponseビューでは、リクエストモデルフィールドのいくつかを表示して、作成者がレスポンスに何を含めるべきかを知りたいと思います。

私の具体的な質問は、私は、要求モデルから一部のデータを表示したいので、ビューのモデルは、要求モデルに

  1. に設定されているが、ビューの目的は、送信することになります応答(応答モデルで定義されています)。ですから、リクエストクラスのフィールドに設定されているViewBag。*プロパティを設定し、リクエストモデルの代わりにそれらを使用し、ビューモデルをレスポンスに設定するだけですか?

  2. 2つのモデル(この場合は要求と応答)を扱うコントローラを1つ用意するのは大丈夫ですか?要するに

、私はただ一つのモデルからデータを受け取り、そのデータに基づいて新しいモデルを作成し、MVCの組み合わせを構築する方法については、100%確かではありませんよ。

+1

SendResponseコントローラアクションでは、提供されたIDのリクエストデータをdbから取得できます。 dbからの要求データとSendResponseビューで表示したい追加データをラップすることができる別のモデルクラスを作成することができます。 –

+1

ビューに表示するデータに基づいてカスタマイズされたモデルクラスを作成することは、常にOKです。 –

+1

両方のモデルをラップする別のviewmodelを設定する方が、ビューが単一のモデルのバインディングメカニズムのみを受け入れることができます。作成したビューモデルをカスタマイズして、渡すデータの一部を表示することができます。 –

答えて

0

典型的なパターンは、ビューごとにモデルを作成することです。コードでは、データベースからRequestオブジェクトを直接送信しています。通常、RequestViewModelを作成し、これをビューに送って作業します。

著者がリンクをクリックすると、リクエストIDが届きます。このIDを使用して、DBから関連するRequestオブジェクトを取得し、それをResponseEditModelに投影します。このモデルでは、リクエストオブジェクトからインクルードしたいいくつかのフィールドをインクルード/宣言します。あなたは基本的にそれらをコピーします。

コントローラーは多くのモデルで使用できますが、ほとんどの場合、1つのビューでモデルを実行することをお勧めします。最も重要なことは、何らかの形でコントローラを結束させることです。要求の処理や応答の処理のように、うまく聞こえます。

+0

ああ、私のリクエストモデルはデータベース内のデータを表すクラスであり、リクエストからrequestviewモデル、ビュー、および送信応答ビューのresponseviewモデルにデータをマーシャリングすると言っています。私はこのアプローチが好きです – andrewb

関連する問題