2016-08-09 8 views
0

私はasp.net IDを持つデフォルトのWebアプリケーションmvc 5テンプレートプロジェクトを使用しています。 私はMovie.csモデルを持っていて、各ユーザーにムービーリストを関連付けました。登録すると、ムービーをCRUDでリストに追加し、ホームページに表示できます。ユーザが作成したリストアイテムを持っていない場合にメッセージを表示するには

enter image description here

私の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> 

は、その後、私はこのラインの場合はnull例外エラーを得た:

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

このように、ユーザーが映画を作成していない場合、各ユーザーの下のリストにメッセージを表示するにはどうすればいいですか?

enter image description here

+0

ApplicationUserモデルで、Moviesプロパティの基になる変数を新しいリスト()に初期化していることを確認してください。ヌルでないことを確認してください。 – Kevin

+0

ちょうどケビンが言ったように、それは空のEnumerableで動作し、あなたのメッセージで 'if(!_user.Movies.Any())'を実行します。 –

+0

@Kevin私のappuserモデルでは、私はこのような映画のためのプロパティを持っています: public List Movies {get;セット; }ので、私はこの権利を行うが、私はそれを公開リストに変更するときはわからないのでムービー=新しいリスト(); 私は私のビューではどのリストも得られません。 – john

答えて

1

を条件を追加:

<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

本当に 'Any'チェックをする必要はありません。ムービーは空の列挙可能なので、とにかく何もレンダリングされません。真でないとメッセージを表示するためのチェックが1つだけ必要です。 –

+0

まあ、そうです。あなたはおそらく文を逆転させ、 'if(!_user.Movies.Any()){

ムービーがありません...

}'を実行します。 :) – mwilczynski

+0

@mwilczynski私はこれを試しましたが、この行のヌル例外がまだ残っています if(_user.Movies.Any()) – john

0

だけでは、簡単にこのような.panel-body内部の任意のムービーがあるか否かをチェックすることによって、これを達成することができますビューで

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

これはすべての動画をループしてカウントが0より大きいかどうかを確認します。 Anyを使用 –

+0

ヒントありがとうございました – Raskayu

+0

Anyはboolをintに戻し、 '> 0'を返しません。私はそれを編集するだろうが、私は限界のためにできない。 –

1

使用Moviesプロパティのバッキング変数を空のリストに初期化します。

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

そして、あなたの財産の定義は次のようになります。

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

    set 
    { 
     _movies = value; 
    } 
} 

これにより、ユーザはまだ映画を追加していない場合には、映画のプロパティではなくヌルの映画の空のリストを返すことを保証します。

関連する問題