C# ASP.NET MVC ViewModels可组合多对多模型关系以查看

C# ASP.NET MVC ViewModels可组合多对多模型关系以查看,c#,asp.net-mvc,many-to-many,asp.net-mvc-viewmodel,C#,Asp.net Mvc,Many To Many,Asp.net Mvc Viewmodel,我正在建立经典电影目录项目 我有一个多对多的电影和流派,这样我可以列出电影中的流派,反之亦然,等等 我对我的模特做这件事有困难。我可以使用模型将一个与视图关联,但需要ViewBag来显示另一个 我是一个初学者,如果您能帮助我攻克高级ViewModels,我将不胜感激 我将使用我的create()电影方法作为示例: 我的电影控制器: [Authorize(Roles = "Admin")] [HttpGet] public ActionResult Create() {

我正在建立经典电影目录项目

我有一个多对多的电影和流派,这样我可以列出电影中的流派,反之亦然,等等

我对我的模特做这件事有困难。我可以使用模型将一个与视图关联,但需要ViewBag来显示另一个

我是一个初学者,如果您能帮助我攻克高级ViewModels,我将不胜感激

我将使用我的create()电影方法作为示例:

我的电影控制器:

[Authorize(Roles = "Admin")]
[HttpGet]
 public ActionResult Create()
        {
            ViewBag.Genres = db.Genres.Select(
                g => new GenreToMovie
                {
                    id = g.Id,
                    Name = g.Name,
                    Checked = false
                }).ToList();
            return View();
        }

...

 //List Genre Movies
        private void MovieLister(Genre genre)
        {
            //Assign Movies to Genre List
            ViewBag.Movies = db.Movies.Select(
                m => new MovieToGenre
                {
                    id = m.Id,
                    Title = m.Title,
                    Year = m.Year,
                    Checked = db.Genres.FirstOrDefault(g => g.Id == genre.Id).Movies.Any(movie => movie.Id == m.Id)
                }).ToList();
我的电影模型:

namespace MovieSite.Models
{
    public class Movie
    {
        public int Id { get; set; }

        [Required]
        public string Title { get; set; }

        [Required]
        public int Year { get; set; }
        public virtual ICollection<Genre> Genres { get; set; }

        public Movie() { }

        public Movie(string title, int year)
        {
            Title = title;
            Year = year;
            Genres = new List<Genre>();
        }

    }

}
我的创建视图:

@model MovieSite.Models.Movie
@{
    ViewBag.Title = "Create Movie";
}
<h2>Add Movie</h2>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">
        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
        <label style="color:red" id="errormsg"></label>
        <div class="form-group">
            @Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control", id = "movieTitle" } })
                @Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.Year, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.EditorFor(model => model.Year, new { htmlAttributes = new { @class = "form-control", id = "movieYear" } })
                @Html.ValidationMessageFor(model => model.Year, "", new { @class = "text-danger" })
            </div>
        </div>
        <div class="form-group">
            @Html.LabelFor(model => model.Genres, htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10" style="height:250px; width:400px; overflow-y:scroll">
                <br />
                @{
                    List<MovieSite.Models.GenreToMovie> moviegenres = ViewBag.Genres;
                    foreach (var genre in moviegenres.OrderBy(m => m.Name))
                    {
                        <ul style="padding:0px">
                            <input type="checkbox" name="SelectedGenres" value="@genre.id" @Html.Raw(genre.Checked ? "checked=\"checked\"" : "") />
                            @genre.Name
                        </ul>
                    }
                }
            </div>
        </div>
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <input type="submit" value="Create" class="btn btn-default"/>
            </div>
        </div>
    </div>
}
<div>
    @Html.ActionLink("Back to List", "Manage")
</div>
@model MovieSite.Models.Movie
@{
ViewBag.Title=“创建电影”;
}
添加电影
@使用(Html.BeginForm())
{
@Html.AntiForgeryToken()

@Html.ValidationSummary(true,“,new{@class=“text danger”}) @LabelFor(model=>model.Title,htmlAttributes:new{@class=“controllabel col-md-2”}) @EditorFor(model=>model.Title,new{htmlAttributes=new{@class=“form control”,id=“movieTitle”}) @Html.ValidationMessageFor(model=>model.Title,“,new{@class=“text danger”}) @LabelFor(model=>model.Year,htmlAttributes:new{@class=“controllabel col-md-2”}) @EditorFor(model=>model.Year,new{htmlAttributes=new{@class=“formcontrol”,id=“movieYear”}) @Html.ValidationMessageFor(model=>model.Year,“,new{@class=“text danger”}) @LabelFor(model=>model.Genres,htmlAttributes:new{@class=“controllabel col-md-2”})
@{ 列出电影类型=ViewBag.Genres; foreach(moviegenres.OrderBy(m=>m.Name)中的var类型) {
    @类型.名称
} } } @ActionLink(“返回列表”、“管理”)
你可以在我的视图的一半以下看到我有一个viewbag:

@{
                    List<MovieSite.Models.GenreToMovie> moviegenres = ViewBag.Genres;
                    foreach (var genre in moviegenres.OrderBy(m => m.Name))
                    {
                        <ul style="padding:0px">
                            <input type="checkbox" name="SelectedGenres" value="@genre.id" @Html.Raw(genre.Checked ? "checked=\"checked\"" : "") />
                            @genre.Name
                        </ul>
                    }
                }
@{
列出电影类型=ViewBag.Genres;
foreach(moviegenres.OrderBy(m=>m.Name)中的var类型)
{
    @类型.名称
} }
来展示我的风格,我不想这样。我曾尝试制作许多视图模型来组合数据,但我一无所获。我已经在桌子上敲了几天了,在网上找不到一个明确的例子。求你了欧比万,你是我唯一的希望

我只需要一个清晰的例子,我就能解决这个问题。我现在无法打开它。谢谢你的时间和帮助

编辑:

根据评论中的建议,我制作了一个viewmodel以供参考: 公共类电影

{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Year { get; set; }
    public string Title { get; set; }
    public bool Checked { get; set; }

    public virtual ICollection<Genre> Genres { get; set; }

    public MovieAddVM()
    {
        GenreList = new List<GenreToMovie>();
    }
    public List<GenreToMovie> GenreList { get; set; }

}
{
公共int Id{get;set;}
公共字符串名称{get;set;}
公共整数年{get;set;}
公共字符串标题{get;set;}
公共布尔检查{get;set;}
公共虚拟ICollection类型{get;set;}
公共电影addvm()
{
GenreList=新列表();
}
公共列表GenreList{get;set;}
}

它在我的视图中注册,但不填充流派列表。如何查询我的类型并将该列表属性化到viewmodel?很抱歉,我对这一切感到非常困惑。

参考一个典型的例子,我就是因为这个才得到它的。非常感谢。
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Year { get; set; }
    public string Title { get; set; }
    public bool Checked { get; set; }

    public virtual ICollection<Genre> Genres { get; set; }

    public MovieAddVM()
    {
        GenreList = new List<GenreToMovie>();
    }
    public List<GenreToMovie> GenreList { get; set; }

}