我使用带有MVC + Identity的默认Web应用程序来管理用户,我试图让每个注册用户制作他的电影列表,并且在登录时只能看到他的列表。
所以,就我的例子而言,我制作了一部电影课
public class Movie
{
public int MovieId { get; set; }
public string MovieName { get; set; }
public string Year { get; set; }
public string Genre { get; set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
在ApplicationUser中我放了
public virtual ICollection<Movie> Movies { get; set; }
有一个电影列表。
我还创建了一个Entity FrameWork MovieController,使用Movie作为模型,使用ApplicationDbContext作为上下文。
所以我在查询数据库时遇到问题,以便让每个用户只能查看他的电影列表,默认的脚手架我在MoviesController的索引操作中得到这个
public ActionResult Index()
{
var movies = db.Movies.ToList();
return View(movies);
}
如果有任何人有我的问题的经验,请帮助,欢迎任何意见,并非常感谢。
答案 0 :(得分:4)
您需要在ApplicationUserID的影片类中添加一个属性,以便在它们之间创建正确的关系,如下所示:
public class Movie
{
public int MovieId { get; set; }
public string MovieName { get; set; }
public string Year { get; set; }
public string Genre { get; set; }
public string ApplicationUserID { get;set; }
public virtual ApplicationUser ApplicationUser { get; set; }
}
现在您可以为这样的用户获取所有电影:
public ActionResult Index()
{
ApplicationDbContext context = new ApplicationDbContext();
string userid = User.Identity.GetUserId();
IEnumerable<Movie> movies = new List<Movie>();
if (!string.IsNullOrEmpty(userid))
{
movies = context.Movies.Where(x => x.ApplicationUserID == userid);
}
return View(movies);
}
答案 1 :(得分:2)
首先,您应该将指向applicationuser(从Movie)的链接更改为一个集合(多对多)。
public virtual ICollection<Movie> Movies { get; set; }
如果您想为登录用户提取电影列表,可以像这样获取用户和电影列表:
var user = UserManager.FindById(User.Identity.GetUserId());
Debug.WriteLine(user.Email);
var movies = user.Movies.ToList();
foreach (var movie in movies)
{
Debug.WriteLine(movie.MovieName);
}
您可以返回一个包含您在自己的代码中完成的电影的视图,而不是写入调试窗口。
- 我还建议您使用视图模型向/从视图发送数据。您现在的方式可能会将整个数据库发送到您的视图(取决于您的查询)。您还可以对您向用户显示的内容进行更细粒度的控制。 (你可以读一下:what-is-viewmodel-in-mvc让你入门)