【问题标题】:ASP. NET MVC3 - How to display all Comments in PostASP。 NET MVC3 - 如何在帖子中显示所有评论
【发布时间】:2013-03-14 12:37:32
【问题描述】:

我是初学者 ASP.net,我想在帖子中显示所有评论。 PostController 中的 Detail() 方法只显示帖子内容,我不知道如何处理 Detail() 方法在帖子中显示评论。

希望有人能帮助我,非常感谢。

我有两个模型

public class Post
{
    public int PostID { get; set; }
    public string Title{ get; set; }
    public string Content{ get; set; }

}
public class Comment
{
    public int CommentID { get; set; }
    public int PostID { get; set; }
    public string Content { get; set; }
}

这是后控制器

public class PostController : Controller
{
   //////
     public ViewResult Detail(int id )
     {
        Post viewpost= (repository.Posts.Single(p => p.PostID == id));

        return View(viewpost);
     }
    ////////////////
}

【问题讨论】:

  • 您真正想要什么?您想在视图中显示内容还是其他任何内容?
  • 我想显示所有 cmets 相关的帖子(主题)。 (对不起,我用的词不完全是)。 (帖子 = 主题 = Theard)
  • 您的数据层使用什么? EF,Linq2Sql?您的存储库是围绕它的抽象吗?
  • 我用的是英孚。公共类 EFPostRepository : IPostRepository { 私有 EFDbContext 上下文 = 新 EFDbContext();公共 IQueryable 帖子 { 获取 { 返回 context.Posts; } } }
  • 所以是的,正如 Mortalus 所说,你应该有一个导航属性来处理这样的场景。然后它会自动为您进行连接。您如何存储您的评论?他们没有被添加到存储库中吗?他们被添加/插入到什么属性?

标签: asp.net asp.net-mvc-3 linq


【解决方案1】:

莫拉勒斯有一个很好的答案。如果您不想更改您的 Post 模型以使其 cmets 具有导航属性,如果您无法控制或其他什么,那么您将不得不制作类似 ViewPostModel 的东西

public class ViewPostModel
{
    public Post Post { get; set; }
    public List<Comment> Comments { get; set; }
}

然后,您必须在存储库中查询这两个列表:

public class PostController : Controller
{
     public ViewResult Detail(int id )
     {
        ViewPostModel viewpost = new ViewPostModel();
        viewPost.Post = repository.Posts.Single(p => p.PostID == id);
        viewPost.Comments = repository.Comments.Where(c=> c.PostID = id).ToList();
        return View(viewpost);
     }
}

【讨论】:

  • 这是假设您的存储库具有 cmets 的属性,因为您没有提供任何与此相关的代码。如果您不存储 cmets,则无法获取它们。因此,要获取它们,您需要访问存储库,访问我假设名为 Comments 的属性。也就是说,如果您没有指定导航属性。
【解决方案2】:

所以首先你应该有一个从帖子到评论的导航属性。 像这样:

public class Post
{
    public int PostID { get; set; }
    public string Title{ get; set; }
    public string Content{ get; set; }

    public virtual IEnummrable<Comment> Comments {get; set;}
}

请注意,如果您使用 DB-First 来执行此操作,则应编辑 EDMX

然后像这样从存储库中获取 cmets:

public ViewResult Detail(int id )
{
   Post viewpost= (repository.Posts.Include("Comments").Single(p => p.PostID == id));
   return View(viewpost);
}

在你看来,迭代你的 cmets 并像那样显示它们

@foreach (var comment in Model.Comments)
{
    @comment.Content
}

编辑: 以上所有内容仅在您使用 EF\ Linq-2-SQL 时才相关(感谢@tostringtheory)

【讨论】:

  • 如果是EF,他没有说明。尽管如此,Linq-2-SQL 仍然具有导航属性。此外,如果 EF,则 Include() 是大写字母。最后,如果模型是从 db 生成的,那么请确保 db 具有 FK 关系,因为这会为您生成导航属性。
  • Posts.include()。 Include() 方法不存在。
  • @nisun。 Include() 扩展方法在 EntityFramework 程序集中,因此如果它没有被引用,则必须添加该引用。此外,该文件需要 System.Data.Entity 的 using 指令才能将 Include() 纳入范围。请注意,使用菜单的小重构/添加不适用于扩展方法。但是,我真的会尝试做其他事情,而不是将 EF 添加到您的 Web 项目中。
  • 谢谢你,Mortalus。祝你有美好的一天。
  • @Mortalus,我还要补充一件事。我不知道你是否看过,但是在使用 EF 时,你不再需要包含指定你想要的“魔术字符串”。您现在可以使用 Lambda 表达式来指定路径,EF 将在运行时为您解析出字符串。这样一来,如果您更改了属性名称,您就会立即得到反馈,表明它不会起作用!
【解决方案3】:

您也可以使用 ViewData 将 cmets 放到 View 中。

例如: 行动: ViewData["Comments"] = repository.Comments.Where(c=> c.PostID = id).ToList();

查看: var cmets =ViewData["Comments"] as List; ...你可以使用 var-cmets

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 2020-02-18
    • 2017-02-11
    • 2012-05-02
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2019-12-07
    相关资源
    最近更新 更多