我知道这个问题已经以各种不同的方式被问了很多,但我仍在努力。
我有两个班级;
public int authorID {get; set;}
public int authorName {get; set;}
public int category_id {get;set}
public int category_id {get;set;}
public int category_name {get;set;}
public virtual ICollection<Author> Authors {get; set;}
在一个页面上,我想在名称旁边显示作者列表及其各自的类别名称。我设法通过返回
来做到这一点db.Authors.Include(c => c.AuthorCategory)
来自我对控制器的看法,但这似乎不对。有没有更好的方法呢?我研究了一些名为ViewModels的东西,但不太明白这会有什么帮助。
另外,例如在“新作者”表单中,我必须在下拉列表中显示作者类别。我会为此使用相同的型号吗?
我知道我的问题非常简单但是来自网络表单背景,我在搞清楚MVC的逻辑时遇到了一些困难。任何帮助表示赞赏!
答案 0 :(得分:0)
你所处的学习曲线很陡峭,但一旦你达到顶峰,你就没事了。然后你将开始学习AngularJS,并想知道你为什么要沿着ASP.Net MVC路线走下去。 :)
如果您在视图中使用单个模型,则无需使用ViewModel。调用db.Authors.Include(c => c.AuthorCategory)
没有任何问题,这正是你需要做的才能超过EF的延迟加载(我猜你正在使用EF)。
现在,您希望在下拉列表中包含“作者类别”,这就是ViewModel的概念所在,因为您不再仅仅在视图中使用单个模型。您需要Author和可用的AuthorCategory值列表。
您可以创建AuthorViewModel.cs类,如:
public class AuthorViewModel
{
public Author Author { get; set; }
public List<AuthorCategory> AuthorCategories { get; private set; }
public AuthorViewModel() {}
public AuthorViewModel(int id)
{
using(var db = new myDbContext())
{
this.Author = db.Authors.SingleOrDefault(a => a.AuthorId == id);
this.AuthorCategories = db.AuthorCategories.ToList();
}
}
}
确保将此视图返回到视图,并将模型设置为AuthorViewModel类而不是Author类:
@model YourNameSpace.AuthorViewModel
我使用了更进一步,而不是拥有public List<AuthorCategory> AuthorCategories { get; private set; }
属性,我实际上将创建为SelectListItem
对象的列表,以便更容易绑定到下拉列表。