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 のトラック レコードごとに 1 つの行を含むテーブルを表示するビューを作成しようとしています。基本的に、これはMVCScaffolding テンプレートからのDetailsビューが続くビューですが、2 つのモデルを使用し、1 つのパラメーター ( fromテーブル) を持ちます。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つのアルバムに多くのトラックを含めることができるように、アルバムとトラックの間に直接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; }
}

これにより、データレイヤーに特定のアルバムに属するすべてのトラックを取り込むことができますが、トラックを知る必要がない場合は、nullのままにすることができます。ただし、データレイヤーは、アルバムをフェッチしてから、TracksプロパティにIQueryableオブジェクトを設定する必要があります。

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 に答える