如何在视图中使用来自多个类(表)的信息?

时间:2011-03-12 07:14:21

标签: c# entity-framework asp.net-mvc-3

在我的数据库中,UserID是一个外键,它转到我的aspnet_Users表中的UserId列。将帖子视为论坛中的帖子,博客条目,等等...当我在视图中列出帖子时,我想显示该人的用户名而不是guid。如何检索并同时将其发送到我的视图?

namespace MySite.Models
{
    public class Post
    {
        public Guid PostID { get; set; }
        public Guid UserID { get; set; }
        public DateTime PostedDate { get; set; }
        public string PostContent { get; set; }
    }
    public class DBContexts : DbContext
    {
        public DbSet<Post> Posts { get; set; }
    }
}
public class PostController : Controller
{
    DBContexts db = new DBContexts();

    public ActionResult Index()
    {
        var posts = db.Posts.ToList();
        return View(posts);
    }
}

2 个答案:

答案 0 :(得分:2)

另一种方法是将aspnet_Users表放入您的实体模型,然后在请求帖子时进行连接以检索其他用户信息。

var posts = (from p in db.Posts
             join u in db.AspNet_Users on p.UserId equals u.UserId
             select new { Post = p, Username = u.UserName }).ToList();

我相信你可以在这里选择整个实体p为匿名类型,而不是必须选择每一列。如果不是这种语法,稍微不同的一个,比如使用groupby就可以了。

我会建议您为每个请求重新创建ObjectContext,并考虑使用存储库模式,这样可以避免重复更复杂的调用,并将它们保存在一个位置。 (这对单元测试也很有用。)

或者,如果您不想在实体模型中包含aspnet_Users表,则可以在数据库中创建一个视图,然后将其作为View添加到实体模型中。也许甚至不是普通的Posts表,但是你无法在视图中插入实体,我认为这是你想要的功能。

编辑(在视图中使用):

变量帖子是一种匿名类型。 C#编译器能够让你在它定义的方法中以强类型的方式使用它,但是一旦你离开那个范围,它就只被称为一个对象。这就是为什么视图中看不到所有属性的原因。

我的建议是定义一个ViewModel类,它通过编译时属性包含这些数据。例如:

public class PostViewModel
{
    public Post Post { get; set; }
    public string Username { get; set; }
}

然后您可以将上述查询修改为更像:

...select new PostViewModel { Post = p, Username = u.UserName }).ToList();

如果您使MVC视图扩展ViewPage&lt; PostViewModel&gt;,那么您现在应该可以轻松访问模型上的Post和Username属性。

答案 1 :(得分:0)

您始终可以使用viewbag向视图发送其他信息。

Relevant.