2016-08-17 7 views
1

エンティティ 'Reserve'、 'ReservesUsers'、およびデフォルト 'ApplicationUser'があります。関連するエンティティをビューに渡す

public class Reserve 
{   
    public int ID { get; set; } 
    public string Begin { get; set; } 
    public string End { get; set; } 
    public string Date { get; set; } 
    public string Status { get; set; } //free , reserved, confirmed, canceled 
    public DateTime LastUpdate { get; set; } 
    public ICollection<ReserveUser> ReservesUsers { get; set; } 
} 

public class ReserveUser 
{ 
    [Key] 
    public int Id { get; set; } 

    public string UserId { get; set; } 
    [ForeignKey("UserId")] 
    public virtual ApplicationUser User { get; set; } 

    public int ReserveId { get; set; } 
    [ForeignKey("ReserveId")] 
    public Reserve Reserve { get; set; } 
} 

public class ApplicationUser : IdentityUser 
{ 
    public bool IsProfessional { get; set; } 
    public ICollection<ReserveUser> ReservesUsers { get; set; } 
} 

私は、ユーザーとビューの準備を必要とするように、私はそれを得る:

var usersByReserve = _context.Reserves 
      .Where(m => m.ID == id) 
      .Include(ru => ru.ReservesUsers) 
       .ThenInclude(ap => ap.User) 
      .ToList(); 

は、どのように私はビューに送信し、それをアクセスすることができます。

は、私が試した:

return View(usersByReserve); 

と働いていませんでした。

要求の処理中に未処理の例外が発生しました。

InvalidOperationException:ViewDataDictionaryに渡されたモデルアイテムが 'System.Collections.Generic.List`1 [Reservation.Models.Reserve]'タイプですが、このViewDataDictionaryインスタンスには 'Reservation.Models'タイプのモデルアイテムが必要です。予備 '。 EnsureCompatible

+1

は機能しませんでしたか?エラーが発生していますか?あなたのビューコードはどのように見えますか? – Shyju

答えて

1

あなたの現在のコードは、ビューに(あなたのwhere句に一致する)コレクションにReserveのクラスオブジェクトを返します。しかしあなたの見解では予約クラスの1つのインスタンスが必要です。 where句が条件であってもレコードが1つでもある場合でも、Whereメソッドはコレクションを返すため、1つのアイテムのコレクションを返します。

1つのアイテム(where句条件に一致)を探しているので、FirstOrDefaultメソッドを使用してそのアイテムを取得できます。

var usersByReserve = _context.Reserves 
      .Where(m => m.ID == id) 
      .Include(ru => ru.ReservesUsers) 
      .ThenInclude(ap => ap.User) 
      .FirstOrDefault(); 
if(usersByReserve !=null) 
{ 
    return View(usersByReserve); 
} 
else 
{ 
    //return a "not found message/view" 
    return Content("No item found for the id passed"); 
} 

ここで、予約クラスに厳密に型指定されたビューを作成し、必要に応じてプロパティにアクセスする必要があります。

@model Reserve 
<h1> @Model.Begin </h1> 
@if(Model.ReservesUsers!=null) 
{ 
    <p>Some ReservesUsers found</p> 
    @foreach(var u in Model.ReservesUsers) 
    { 
    <p>@u.UserId </p> 
    } 
} 
else 
{ 
    <p>No ReservesUsers found!</p> 
} 
+0

ありがとうShyju、私は仕事をするためにいくつかの修正を行いました、最初に '@model Reserve'を '@ model i.nodelable 'に置き換え、2番目にforループを入れました: '@foreach'(varモデル内の項目) {foreachの( } 'user.User.Email @' item.ReservesUsersにおけるVARユーザ) {} –

+1

@UgoAugustoGustavoGuazelliのいや。これは、ページに複数の予約アイテムを表示する場合に有効です。あなたは最初にデフォルト呼び出しをする必要はありません。 – Shyju

関連する問題