2017-02-09 55 views
0

我有一個控制器有兩個動作。構建MVC應用程序的正確方法

使用實體框架獲取數據庫請求列表的第一個操作,然後視圖顯示它們。

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

的觀點是:

@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> 
} 

最後一個請求,該模型是

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; } 
} 

如果你看一下視圖代碼I輸出一個鏈接,將用戶帶到首頁/ SendResponse /編號

這就是我不確定性的地方。

SendResponse操作的目的是回覆特定的請求。在SendResponse視圖中,我想顯示一些請求模型字段,以便作者知道應包含哪些內容。

我的具體問題是

  1. 因爲我想要顯示從請求模型的一些數據,該視圖的模型將被設置爲請求模型,但視圖的目的將是發送一個響應(在響應模型中定義)。所以,我應該只設置一些ViewBag。*屬性設置爲請求類中的字段,並使用它們而不是請求模型,然後將我的視圖模型設置爲響應?

  2. 有一個控制器處理兩個模型(在這種情況下是請求和響應)是好的/最佳做法?

總之,我對如何構建MVC組合從一個模型中獲取數據,然後創建基於該數據的新的模型只是沒有100%確定。

+1

在SendResponse控制器操作中,您可以從數據庫獲取所提供ID的請求數據。您可以創建另一個模型類,它可以包裝來自數據庫的請求數據以及您想要在SendResponse視圖中顯示的任何其他數據。 –

+1

根據要在視圖上顯示的數據創建自定義模型類總是可以的。 –

+1

由於視圖只接受單個模型綁定機制,所以最好設置包裝兩個模型的另一個視圖模型。可以對創建的視圖模型進行自定義以包含要傳入視圖的某些數據部分。 –

回答

0

一個典型的模式是爲每個視圖創建一個模型。在你的代碼中,你直接從你的數據庫發送Request對象。通常會創建一個RequestViewModel並將其發送給視圖以應對。

當作者點擊你的鏈接時,你會收到一個請求ID。您可以使用ID從數據庫中檢索相關的Request對象,然後將其投影到ResponseEditModel中。您在此模型中包含/聲明瞭一些您​​希望從請求對象中包含的字段。你基本上覆制它們。

控制器可以處理很多模型,我實際上建議在大多數情況下爲每個視圖執行一個模型。最重要的是以某種方式保持控制器的凝聚力,例如處理請求和處理響應,聽起來很好。

+0

好吧,我的請求模型是一個代表數據庫中數據的類,並且您正在說要將請求中的數據編組爲請求視圖模型,視圖以及發送響應視圖的響應視圖模型。我喜歡這種方法 – andrewb

相關問題