2016-08-09 61 views
0

Im Verwenden des Standardprojekts Webanwendung mvc 5 template mit asp.net identity. Ich habe ein Movie.cs-Modell und verknüpfte jeden Benutzer mit einer Filmliste. Wenn Sie sich registrieren, können Sie also Filme in der Liste mit CRUD hinzufügen und sie auf der Startseite anzeigen.So zeigen Sie eine Nachricht an, wenn der Benutzer keine Listenelemente erstellt hat

enter image description here

meine Viewmodel:

@model MovieApp.ViewModels.UserMovieViewModel 
@using MovieApp.Models; 

<div class="row" style="margin-top:60px"> 
    @using (ApplicationDbContext db = new ApplicationDbContext()) 
    { 
     if (db.Users.Any()) 
     { 
      foreach (var _user in Model.ApplicationUser) 
      { 
       <div class="col-md-4"> 
        <div class="panel panel-primary"> 
         <div class="panel-heading"> 
          <h3 class="panel-title">@_user.UserName</h3> 
         </div> 
         <div class="panel-body"> 
          <ul> 
           @foreach (var _movie in _user.Movies.Where(x => x.ApplicationUserID == _user.Id)) 
           { 
            <li>@_movie.MovieName</li>           
           } 
          </ul> 
         </div> 
        </div> 
       </div> 
      } 
     } 
     else 
     { 
      <h2 class="alert alert-danger text-center">No movie lists</h2> 
     } 
    } 

</div> 

Wenn ich einen Benutzer haben, die alle Filme in der Liste hinzugefügt, dann habe ich für diese Linie null Ausnahmefehler bekam:

@foreach (var _movie in _user.Movies.Where(x => x.ApplicationUserID == _user.Id)) 

so, wie Nachricht (wie in der Abbildung unten) in der Liste unter jedem Benutzer anzuzeigen, wenn der Benutzer keine Filme erstellt hat?

enter image description here

+0

Stellen Sie sicher, dass Sie in Ihrem ApplicationUser-Modell die zugrunde liegende Variable für die Eigenschaft "Movies" in eine neue Liste initialisieren (); um sicherzustellen, dass es nie null ist. – Kevin

+0

Tun Sie einfach, was Kevin sagte, so wird es auf einem leeren Enumerable operieren und dann: 'if (! _user.Movies.Any())' mit Ihrer Nachricht. –

+0

@Kevin In meinem Appuser-Modell habe ich eine Eigenschaft für Filme wie folgt: öffentliche Liste Filme {get; einstellen; }, also weiß ich nicht, ob ich das richtig mache, aber wenn ich es in die öffentliche Liste ändere Movies = new List (); dann bekomme ich aus meiner Sicht keine Liste. – john

Antwort

1

Sie können diese leicht erreichen, indem geprüft wird, ob es einen Film ist oder nicht innerhalb .panel-body wie folgt aus:

<div class="panel-body"> 
    @if(_user.Movies != null && _user.Movies.Any()) { 
     <ul> 
      @foreach (var _movie in _user.Movies.Where(x => x.ApplicationUserID == _user.Id)) 
      { 
       <li>@_movie.MovieName</li> 
      } 
     </ul> 
    } 
    else 
    { 
     <p>No movies...</p> 
    } 
</div> 
+0

Sie brauchen nicht die 'Any' Prüfung für wahr. Filme sind leere Aufzählungszeichen, daher wird nichts wiedergegeben. Nur eine Überprüfung auf nicht wahr und Display-Nachricht. –

+0

Nun, ja. Sie könnten vielleicht die Anweisung invertieren und 'if (! _user.Movies.Any()) {

No movies ...

}'. :) – mwilczynski

+0

@mwilczynski Ich versuchte dies, aber ich bekomme immer noch null Ausnahme für diese Zeile if (_user.Movies.Any()) – john

0

Nur eine Bedingung in der Ansicht hinzufügen

if (_user.Movies.Any()) 
{ 
    your foreach 
} 
else 
{ 
    your message 
} 
+1

Dies wird jedoch durch alle Filme durchlaufen und dann überprüfen, ob der Zählwert mehr als 0 ist. Verwenden Sie 'Any' –

+0

True, danke für den Hinweis – Raskayu

+0

' Any' gibt eine Bool nicht Int, brauchen nicht '> 0' . Ich würde es bearbeiten, aber ich kann nicht begrenzen. –

1

Verwenden eine Unterstützungsvariable für Ihre Movies-Eigenschaft und initialisieren Sie sie auf eine leere Liste:

IList<Movie> _movies = new List<Movie>(); 

Dann werden Ihre Eigenschaftsdefinition wird:

IList<Movie> Movies 
{ 
    get 
    { 
     return _movies; 
    } 

    set 
    { 
     _movies = value; 
    } 
} 

Dadurch wird sichergestellt, dass, wenn ein Benutzer hat noch keine Filme hinzugefügt, wird die Filme Eigenschaft eine leere Liste von Filmen zurückkehrt statt null.