在我的数据库中,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);
}
}
答案 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向视图发送其他信息。