如何在帖子下显示评论

时间:2016-10-03 21:34:38

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

我的项目有问题我是MVC的新手,所以请帮我解决。我有问题在相关的帖子下显示评论,就像我们在脸书中发帖,我们在帖子下面发表评论并显示,我已经显示并列出了所有帖子,在此我已经显示了评论字段,我只是想知道如何显示相关评论, 查看

    @foreach (Post item in Model.posts)
{
    foreach(Comment c in item.comments)
    {
<div>

    <p>
        @item.Body
    </p>
    <p>@item.timeDate</p>
    <p>@c.Body</p>

</div>   
    using (Html.BeginForm("CreateComment", "Posts", FormMethod.Post))
    {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Comment</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.comment.Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.comment.Name)
            @Html.ValidationMessageFor(model => model.comment.Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.comment.Email)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.comment.Email)
            @Html.ValidationMessageFor(model => model.comment.Email)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.comment.Body)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.comment.Body)
            @Html.ValidationMessageFor(model => model.comment.Body)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.comment.dateTime)
        </div>
        <div class="editor-field">
           @Html.TextBoxFor(model => model.comment.dateTime, new { id = "datepicker", @Value = @DateTime.Now })
           @Html.ValidationMessageFor(model => model.post.timeDate)
        </div>       
        <div class="editor-field">
           <input type ="text" hidden="hidden" value="@item.Id" name="txtpostId"/>
            @Html.ValidationMessageFor(model => model.comment.PostId)
        </div>

        <p>
            <input type="submit" value="Create"/>
        </p>
    </fieldset>
    }
  }
}

控制器

 public ActionResult Index()
    {
        objVmPost.comment = new Comment();
        objVmPost.post = new Post();
        List<Post> mylist = db.Posts.Include(post => post.Comments).ToList();
        objVmPost.posts = mylist;
        return View("Index",objVmPost);
    }
 [HttpPost]
    public ActionResult CreateComment(VmPost objVmpost)
    {
        objVmpost.comment.PostId = Convert.ToInt32(Request.Form["txtpostId"]);
        db.Comments.Add(objVmpost.comment);
        db.SaveChanges();
        List<Post> mylist = objPostDb.GetAll().ToList();
        objVmpost.posts = mylist;
        return View("index", objVmpost);
    }

模型

public partial class Comment
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Body { get; set; }
    public System.DateTime dateTime { get; set; }
    public int PostId { get; set; }

    public virtual Post Post { get; set; }
}

public partial class Post
    {
        public Post()
        {
            this.Comments = new HashSet<Comment>();
            this.Tags = new HashSet<Tag>();
        }

        public int Id { get; set; }
        public System.DateTime timeDate { get; set; }
        public string Body { get; set; }

        public virtual ICollection<Comment> Comments { get; set; }
        public virtual ICollection<Tag> Tags { get; set; }
    }

This is the problem click here

1 个答案:

答案 0 :(得分:2)

在您的控制器中,您正在执行此操作

List<Comment> cmntlist = db.Comments.ToList();

转换为SQL

SELECT * FROM `comments`

因此,您不是要检索相关注释,而是存储在数据库中的所有注释。

你可以使用延迟加载机制,你的控制器看起来像这样

public ActionResult Index()
{
    objVmPost.post = new Post();
    List<Post> mylist = db.Posts.ToList();
    objVmPost.posts = mylist;
    return View("Index",objVmPost);
}

或急切加载

public ActionResult Index()
{
    objVmPost.post = new Post();
    List<Post> mylist = db.Posts.Include(post => post.Comments).ToList();
    objVmPost.posts = mylist;
    return View("Index",objVmPost);
}

您可以阅读有关lazy loading and eager loading

的更多信息

无论您想采用哪种方法,您的foreach循环应如下所示:

foreach(var post in Model.Posts){
    <p>@post.Body</p>
    <p>@post.timeDate</p>
    foreach(var comment in post.Comments){
        <p>@comment.Body</p>
    }
    // here you can add your comment form
}