在一个视图中从多对多相关表中加载数据 asp.net
Load data from many to many related tables in one view asp.net
我是 asp.net 的新手,可能缺少一些简单的解决方案。所以基本上我有两个表 Movie 和 Actor 这是他们的模型:
public class Movie
{
public Movie()
{
this.Actors = new HashSet<Actor>();
}
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Genre { get; set; }
[Required]
public DateTime ReleaseDate { get; set; }
[Required]
public DateTime AddDate { get; set; }
public virtual ICollection<Actor> Actors { get; set; }
}
public class Actor
{
public Actor()
{
this.Movies = new HashSet<Movie>();
}
public int id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<Movie> Movies { get; set; }
public DateTime BirthDate { get; set; }
}
我正在尝试使用 ViewModel 从电影中加载电影详细信息和演员列表:
public class MovieDetailsViewModel
{
public Movie Movie { get; set; }
public Actor Actor { get; set; }
}
它的控制器在这里:
private ApplicationDbContext _context;
public MoviesController()
{
_context = new ApplicationDbContext();
}
protected override void Dispose(bool disposing)
{
_context.Dispose();
}
public ActionResult Index()
{
var movie = _context.Movies.ToList();
return View(movie);
}
public ActionResult Details(int id)
{
var movie = _context.Movies.SingleOrDefault(m => m.Id == id);
var actor = _context.Actors.SingleOrDefault(a => a.id == id);
var viewModel = new MovieDetailsViewModel
{
Movie = movie,
Actor = actor
};
if (movie == null)
return HttpNotFound();
return View(viewModel);
}
Action Details 是需要加载我需要的数据的那个。
视图看起来像这样:
@model Movie_Rentals.ViewModels.MovieDetailsViewModel
@{
ViewBag.Title = Model.Movie.Name;
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@Model.Movie.Name</h2>
<ul>
<li>Genre: @Model.Movie.Genre</li>
<li>Release date: @Model.Movie.ReleaseDate.ToShortDateString()</li>
<li>Add date: @Model.Movie.AddDate.ToShortDateString()</li>
<li>Actors:@Model.Movie.Actors</li>
</ul>
它显示 Actors:System.Collections.Generic.HashSet`1[Movie_Rentals.Models.Actor] 我想应该是这样,但我无法找到解决方案关于如何让它显示实际的演员列表。有没有人对我的问题有任何想法,我将不胜感激。
P.S。我的母语不是英语,如果我的英语不好请见谅。
您需要使用
加载包含所有 Actor 的电影
_context.Movies.Include(x => x.Actors).SingleOrDefault(m => m.Id == id);
然后在视图中
@foreach (var x in Model.Movie.Actors)
{<li>x.Name</li>}
要允许显示 Actors 字段,您可以通过几种方式处理。最简单的解决方案是添加一个 属性 来将 Actors 集合解析为字符串。您还可以将代码直接写入视图以遍历集合中的每个演员。
示例:
public class Movie
{
public Movie()
{
this.Actors = new HashSet<Actor>();
}
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Genre { get; set; }
[Required]
public DateTime ReleaseDate { get; set; }
[Required]
public DateTime AddDate { get; set; }
public virtual ICollection<Actor> Actors { get; set; }
public string ActorsToString
{
get
{
string _resultSet = "";
if (Actors != null && Actors.Count > 0)
{
foreach (Actor _actor in Actors)
{
_resultSet += $"{_actor.Name}, ";
}
}
return _resultSet;
}
}
}
在您看来您可以尝试:
<li>Actors: @string.Join("," Model.Movie.Actors.Select(a => a.Name).ToList())</li>
这样,您将显示与您添加到视图模型的电影关联的演员姓名列表。
但我建议您重构视图模型以包含演员姓名列表,这样您就可以从视图中删除逻辑。之后,您的视图应如下所示:
public class MovieDetailsViewModel
{
public Movie Movie { get; set; }
public List<string> ActorsNames { get; set; }
}
在你的控制器中你应该做:
public ActionResult Details(int id)
{
var movie = _context.Movies.SingleOrDefault(m => m.Id == id);
var viewModel = new MovieDetailsViewModel
{
Movie = movie,
ActorsNames = string.Join(",", movie.Actors.Select(a => a.Name).ToList())
};
if (movie == null)
return HttpNotFound();
return View(viewModel);
}
如您所见,我删除了从 Actors DbSet 中获取单个 actor 的代码,因为它没有用。事实上,您想要从电影 DbSet 获得的电影中出现的所有演员的完整列表,而不仅仅是与您必须加载其详细信息的电影具有相同 ID 的演员。
此外,确保已激活延迟加载以获取与电影关联的演员集合,否则,您将得到一个空集合。
如果我的建议有用,请告诉我。
我是 asp.net 的新手,可能缺少一些简单的解决方案。所以基本上我有两个表 Movie 和 Actor 这是他们的模型:
public class Movie
{
public Movie()
{
this.Actors = new HashSet<Actor>();
}
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Genre { get; set; }
[Required]
public DateTime ReleaseDate { get; set; }
[Required]
public DateTime AddDate { get; set; }
public virtual ICollection<Actor> Actors { get; set; }
}
public class Actor
{
public Actor()
{
this.Movies = new HashSet<Movie>();
}
public int id { get; set; }
[Required]
public string Name { get; set; }
public virtual ICollection<Movie> Movies { get; set; }
public DateTime BirthDate { get; set; }
}
我正在尝试使用 ViewModel 从电影中加载电影详细信息和演员列表:
public class MovieDetailsViewModel
{
public Movie Movie { get; set; }
public Actor Actor { get; set; }
}
它的控制器在这里:
private ApplicationDbContext _context;
public MoviesController()
{
_context = new ApplicationDbContext();
}
protected override void Dispose(bool disposing)
{
_context.Dispose();
}
public ActionResult Index()
{
var movie = _context.Movies.ToList();
return View(movie);
}
public ActionResult Details(int id)
{
var movie = _context.Movies.SingleOrDefault(m => m.Id == id);
var actor = _context.Actors.SingleOrDefault(a => a.id == id);
var viewModel = new MovieDetailsViewModel
{
Movie = movie,
Actor = actor
};
if (movie == null)
return HttpNotFound();
return View(viewModel);
}
Action Details 是需要加载我需要的数据的那个。 视图看起来像这样:
@model Movie_Rentals.ViewModels.MovieDetailsViewModel
@{
ViewBag.Title = Model.Movie.Name;
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>@Model.Movie.Name</h2>
<ul>
<li>Genre: @Model.Movie.Genre</li>
<li>Release date: @Model.Movie.ReleaseDate.ToShortDateString()</li>
<li>Add date: @Model.Movie.AddDate.ToShortDateString()</li>
<li>Actors:@Model.Movie.Actors</li>
</ul>
它显示 Actors:System.Collections.Generic.HashSet`1[Movie_Rentals.Models.Actor] 我想应该是这样,但我无法找到解决方案关于如何让它显示实际的演员列表。有没有人对我的问题有任何想法,我将不胜感激。
P.S。我的母语不是英语,如果我的英语不好请见谅。
您需要使用
加载包含所有 Actor 的电影_context.Movies.Include(x => x.Actors).SingleOrDefault(m => m.Id == id);
然后在视图中
@foreach (var x in Model.Movie.Actors)
{<li>x.Name</li>}
要允许显示 Actors 字段,您可以通过几种方式处理。最简单的解决方案是添加一个 属性 来将 Actors 集合解析为字符串。您还可以将代码直接写入视图以遍历集合中的每个演员。
示例:
public class Movie
{
public Movie()
{
this.Actors = new HashSet<Actor>();
}
public int Id { get; set; }
[Required]
public string Name { get; set; }
[Required]
public string Genre { get; set; }
[Required]
public DateTime ReleaseDate { get; set; }
[Required]
public DateTime AddDate { get; set; }
public virtual ICollection<Actor> Actors { get; set; }
public string ActorsToString
{
get
{
string _resultSet = "";
if (Actors != null && Actors.Count > 0)
{
foreach (Actor _actor in Actors)
{
_resultSet += $"{_actor.Name}, ";
}
}
return _resultSet;
}
}
}
在您看来您可以尝试:
<li>Actors: @string.Join("," Model.Movie.Actors.Select(a => a.Name).ToList())</li>
这样,您将显示与您添加到视图模型的电影关联的演员姓名列表。
但我建议您重构视图模型以包含演员姓名列表,这样您就可以从视图中删除逻辑。之后,您的视图应如下所示:
public class MovieDetailsViewModel
{
public Movie Movie { get; set; }
public List<string> ActorsNames { get; set; }
}
在你的控制器中你应该做:
public ActionResult Details(int id)
{
var movie = _context.Movies.SingleOrDefault(m => m.Id == id);
var viewModel = new MovieDetailsViewModel
{
Movie = movie,
ActorsNames = string.Join(",", movie.Actors.Select(a => a.Name).ToList())
};
if (movie == null)
return HttpNotFound();
return View(viewModel);
}
如您所见,我删除了从 Actors DbSet 中获取单个 actor 的代码,因为它没有用。事实上,您想要从电影 DbSet 获得的电影中出现的所有演员的完整列表,而不仅仅是与您必须加载其详细信息的电影具有相同 ID 的演员。
此外,确保已激活延迟加载以获取与电影关联的演员集合,否则,您将得到一个空集合。
如果我的建议有用,请告诉我。