2012-08-24 65 views
0

我有兩個表日期和歌曲。其中DateId是Song表的外鍵。傳遞值在Asp.net MVC3查看

- Date: 
    DateId 
    Date 
- Song: 
    SongId 
    DateId 
    Title 

下面是函數:

public ActionResult Index() 
     {    
      var song = db.TopSongs; 
      var model = db.Dates; 
      var latestDate = model.OrderByDescending(d => d.Date).FirstOrDefault(); 
      return View(latestDate); 
     } 

我需要證明:鑑於 Date SongId Title。但是返回View只接受一個參數。有沒有辦法傳遞兩個表數據來查看?

回答

2

有兩種選擇:

  1. 使用ViewBag

    ViewBag.song = db.TopSongs; 
    ViewBag.model = db.Dates 
    ViewBag.latestDate = model.OrderByDescending(d => d.Date).FirstOrDefault(); 
    
  2. 創建包含您需要的信息一個新的類,並返回(即view model)。

注意是優選的選擇,因爲它允許你保持強類型(該ViewBag使用動態類型)。

+0

查看模型+1。 – DarthVader

+0

@dbaseman - 您認爲在Index()下添加5或6 ViewBag的設計是一種很好的設計?或者我應該使用一個班級? – NoviceMe

+0

@NoviceMe肯定會更好地使用一個類......在大多數情況下最好避免使用ViewBag。 – McGarnagle

2

您需要創建一個'View Model';

public class ViewModel 
{ 
    public int SongId { get; set; } 
    public DateTime Date { get; set; } 
    public string Title { get; set; } 
    //More properties that are needed in View 
} 

然後填充此;

var viewModel = new List<ViewModel> { //Populate code here }; 

而且通過這個填充視圖模型視圖

return (viewModel); 

,並在視圖本身這個參考;

@model IEnumerable<ViewModel> 

最後,在View中顯示;

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.Title) 
     </td> 
    </tr> 
} 

請注意,您的視圖模型的實際性能會有所不同,上面的代碼只是爲了顯示你怎麼可能實現這一目標。

+0

感謝您的代碼第一!我還有幾個問題。所以這個ViewModel類將成爲Controller的一部分?還是查看?同樣,這個類應該使用Song和Date表調用另外兩個類並填充所有字段?是不是像寫重複的代碼?因爲我已經爲Song和Date表定義了類?再次感謝您花時間編寫代碼! – NoviceMe

+0

@NoviceMe它將是一個獨立的類,只定義在視圖中顯示信息所需的屬性。我知道它可能會覺得你在複製信息,但這是一個好方法。視圖模型應該只包含這些所需的字段。沒有更多,沒有更多。這個類可能存在於應該在新的MVC應用程序中創建的Models目錄中,並且如上所述將在您的控制器中填充,然後在視圖中引用,如上所述。 – ChrisBint