MVC如何阅读相关数据

时间:2016-03-10 22:58:07

标签: asp.net-mvc asp.net-mvc-5

我知道这个问题已经以各种不同的方式被问了很多,但我仍在努力。

我有两个班级;

作者

public int authorID {get; set;}
public int authorName {get; set;}
public int category_id {get;set}

AuthorCategory

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的逻辑时遇到了一些困难。任何帮助表示赞赏!

1 个答案:

答案 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对象的列表,以便更容易绑定到下拉列表。