首页 > 解决方案 > 在一个视图 asp.net 中从多到多相关表中加载数据

问题描述

我是 asp.net 的新手,可能缺少一些简单的解决方案。所以基本上我有两张表MovieActor这里是他们的模型:

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]我认为它应该显示,但我无法找到如何使其显示实际演员列表的解决方案。有没有人对我的问题有任何想法,我将不胜感激。

PS我不是以英语为母语的人,如果我的英语不好,请见谅。

标签: c#asp.netviewmany-to-manyviewmodel

解决方案


在您看来,您可以尝试:

<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 中获取单个演员的代码,因为它没有用。实际上,您想要从 Movies DbSet 获得的电影中出现的所有演员的完整列表,而不仅仅是一个与您必须加载其详细信息的电影具有相同 id 的演员。

此外,请确保已激活延迟加载以获取与电影关联的演员集合,否则,您将获得一个空集合。

让我知道我的建议是否有用。


推荐阅读