C# ASP.NET MVC ViewModels可组合多对多模型关系以查看
我正在建立经典电影目录项目 我有一个多对多的电影和流派,这样我可以列出电影中的流派,反之亦然,等等 我对我的模特做这件事有困难。我可以使用模型将一个与视图关联,但需要ViewBag来显示另一个 我是一个初学者,如果您能帮助我攻克高级ViewModels,我将不胜感激 我将使用我的create()电影方法作为示例: 我的电影控制器: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() {
[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; }
}