2012-08-24 46 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