3

我正在尝试使用 MVCScaffolding 和 ASP.NET 组合(我认为是)一个简单的 ASP.NET Web 应用程序。SQL 中有一个基本的数据表层次结构:dbo.Albums、dbo.Tracks。

模型很简单。对于专辑:

public class Albums {
public int ID { get; set; }
public string Artist { get; set; }
    public string AlbumTitle { get; set; }
public string Notes { get; set; } 
}

public class Tracks {
public int ID { get; set; }
public int AlbumID { get; set; }
public string TrackTitle { get; set; }
public string Notes { get; set; }
}

基本的 CRUD 视图已构建并且工作正常。但是,我正在尝试构建一个视图,该视图显示Album模型数据,后跟一个表,其中一行用于给定 AlbumId 的每个跟踪记录。本质上,这是MVCScaffolding 模板中的Details视图后跟的视图,但它使用两个模型并有一个参数(来自表)。IndexIDAlbums

我试图将模型添加在一起以从那里访问数据,但我不知道如何迭代列表(索引视图使用@model IEnumerable<Music.Models.Tracks>)。这是组合模型:

public class AlbumsExtended
{
    public Albums Albums { get; set; }
    public Tracks Tracks { get; set; }
}

我正在尝试在 AlbumsExt.cshtml 中使用@model Music.Models.AlbumsExtended. 控制器如下所示:

public ViewResult AlbumExt(int id)
    {
        return View(tracksRepository.All.Where(tracks => tracks.AlbumId == id));
    }

但显然这是不正确的。

4

1 回答 1

5

鉴于您的专辑和曲目的结构,最好在专辑和曲目之间建立直接的一对多关系,以便 1 个专辑可以包含许多曲目。无论一首曲目可能出现在多少张专辑中,您的模型都可能如下所示:

public class Albums {
    public int ID { get; set; }
    public string Artist { get; set; }
    public string AlbumTitle { get; set; }
    public string Notes { get; set; } 
    public IQueryable<Track> Tracks { get; set; }
}

public class Track {
    public int ID { get; set; }
    public int AlbumID { get; set; }    // This may be unnecessary 
    public string TrackTitle { get; set; }
    public string Notes { get; set; }
}

这将允许您的数据层填充属于特定专辑的所有曲目,但如果您不需要知道曲目,它可以保持为空。但是您的数据层只需要获取专辑,然后使用 IQueryable 对象填充 Tracks 属性。

public ViewResult AlbumExt(int id)
{
    Album album = albumRepository.All.Where(a => a.ID == id);
    album.Tracks = tracksRepository.All.Where(t => t.AlbumId == id);
    return View(album);
}

这将为您提供一个模型,但仍然可以通过视图中的 Model.Tracks 属性访问所有相关轨道:

@model MyNameSpace.Album

@{
    foreach (var track in Model.Tracks)
    {
        <text>
            <h1>@track.TrackTitle</h1><br />
        </text>
    }    
}
于 2012-06-04T23:04:13.580 回答