2017-05-23 1 views
-7

Hallo im Versuch, eine Musik-App für den Austausch von Musik zu machen, aber ich habe das folgende Problem. Look red circleKann nicht Künstler in meinem asp mvc Website

Wo ich den roten Kreis platzierte, möchte ich den Künstler laden, den ich in meiner Klasse gemacht habe. Ich habe es mit einem Wörterbuch versucht, aber arbeite nicht die Erweiterung PagedList.

Die Ansicht von der Webseite oben wie folgt aussieht:

<div class="panel panel-default"> 
<table class="table"> 

    @foreach (var item in (IEnumerable<Song>) ViewData["songs"]) 
    { 
     <tr> 
      <td> 
       @Html.DisplayFor(modelItem => item.Name) 
      </td> 
      <td> 
       @Html.DisplayFor(modelItem => item.Genre) 
      </td> 
      <td> 
       <a class="artist">Artiest</a> 
      </td> 
      <td> 
       <a class="playbtn btn btn-sm btn-default btn-circle pull-right" data-item="@item.Mp3File"><span class="glyphicon glyphicon-play"></span></a> 
      </td> 
      <td> 
       <button class="btn btn-default glyphicon glyphicon-plus favoritebutton pull-right">Add to favorites</button> 
      </td> 
     </tr> 
    } 
</table> 

und die Steuerung des Songs sieht folgende:

public ActionResult Index(int page = 1, int pagesize = 8) 
    { 
      List<Artist> artists = artistRepository.GetArtistBySongID(int id); 
      List<Song> songs = songRepository.ReadSongs(); 
      List<Song> recommended = songRepository.GetFavoritesById(Convert.ToInt32(Session["userid"])); 
      ViewData["recommended"] = recommended; 
      PagedList<Song> pagedList = new PagedList<Song>(songs, page, pagesize); 
      ViewData["songs"] = pagedList; 
      return View(); 
    } 

Mein Lied Klasse sieht wie folgt vor:

public class Song 
{ 
    private int id; 
    private string name; 
    private string genre; 
    private DateTime release_date; 
    private string mp3file; 

    public int Id 
    { 
     get { return id; } 
     set { id = value; } 
    } 

    public string Name 
    { 
     get { return name; } 
     set { name = value; } 
    } 

    public string Genre 
    { 
     get { return genre; } 
     set { genre = value; } 
    } 

    public DateTime ReleaseDate 
    { 
     get { return release_date; } 
     set { release_date = value; } 
    } 

    public string Mp3File 
    { 
     get { return mp3file; } 
     set { mp3file = value; } 
    } 

    public Song(string name, string genre, DateTime release_date, string mp3file) 
    { 
     this.name = name; 
     this.genre = genre; 
     this.release_date = release_date; 
     this.mp3file = mp3file; 
    } 

    public Song(int id, string name, string genre, DateTime release_date, string mp3file) 
    { 
     this.id = id; 
     this.name = name; 
     this.genre = genre; 
     this.release_date = release_date; 
     this.mp3file = mp3file; 
    } 

    public override string ToString() 
    { 
     return String.Format("{0}, {1}, {2}, {3}, {4}", Id, Name, Genre, ReleaseDate, mp3file); 
    } 
+1

'.GetArtistBySongID (int id);' - das wird nicht kompilieren ?? Woher kommt 'id'? – Alex

+0

Das muss ich wissen. Wie kann ich die ID von der HTML-Seite bekommen? –

+0

Wie sieht 'Song' aus? Kannst du deine Frage editieren, um den Code der 'Song' Klasse anzuzeigen? – Alex

Antwort

0

Liste der Künstler = artistRepository.GetArtistBySongID (int id);

Dies ist Ihr erstes Problem. Sie möchten eine Liste von Künstlern - jeder entspricht einem Lied, aber Sie geben ihm nur die ID eines Liedes. Das würde einen Künstler zurückbringen, keine Liste. Also, du musst durch deine Songliste gehen, die ID herausholen, den Künstler für diesen Song holen und eine Liste erstellen.

List<Artist> artists = new List<Artist>(); 
List<Song> songs = songRepository.ReadSongs(); 

PagedList<Song> pagedList = new PagedList<Song>(songs, page, pagesize); 
foreach(var song in pagedList) 
     artists.Add(artistRepository.GetArtistBySongID(song.ID)); 

ViewData["songs"] = pagedList; 
ViewData["artists"] = artists; 

Aber dies nur ein Teil des Problems gelöst, denn jetzt in der Ansicht, wir müssen zur gleichen Zeit durch die Künstlerliste Schritt, wie wir durch die Song-Liste sind zu treten.

Ich denke, die einfachste Lösung wäre, eine Artist-Eigenschaft zum Song Objekt hinzufügen, aber das kann dazu führen, dass es eigene Probleme. (Aber, versuchen Sie es zuerst, bevor Sie fortfahren).

Wenn Sie die Eigenschaft nicht zu dem SOng-Objekt hinzufügen können, wäre die nächste beste, ein Tuple zu machen.

List<Song> songs = songRepository.ReadSongs(); 

PagedList<Song> pagedList = new PagedList<Song>(songs, page, pagesize); 
var songartists = new List<Tuple<Song, Artist>> 

foreach(var song in pagedList) 
     songartists .Add(Tuple.Creeate(song, artistRepository.GetArtistBySongID(song.ID))); 

ViewData["songs"] = songartists ; 

Dann Sie Änderung anzeigen

@foreach (var item in (IEnumerable<Song>) ViewData["songs"]) 
{ 

zu:

@foreach (var song in (IEnumerable<Tuple<Song, Artist>) ViewData["songs"]) 
{ 
    var item = song.Item1; 
    var artist = song.Item2;