如何在.NET Core MVC中发表评论?

时间:2018-08-02 22:52:57

标签: asp.net-mvc asp.net-core-mvc model-binding

比方说,我有一篇博客文章,其中包含适当的视图模型(文章的内容,撰写者等)。页面中的所有内容都绑定到该视图模型。然后,在底部,我有一个注释部分,其中使用@foreach循环呈现注释。

如果有人要发布新评论,我该如何将标签发布到正确的操作中以添加他们的新评论?我已经考虑过在视图模型中添加一个“ NewComment”字段,并在发布时检查该字段以查看其中是否包含任何内容,并据此采取相应的措施,但是感觉很麻烦。如果我可以为标签定义一个新的@model,我觉得可以用,但是据我所知我不能这样做。

正确的方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以尝试ViewComponent,详细步骤如下:

  1. 定义帖子类和评论类是一对多关系

     public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
        public Blog Blog { get; set; }
        public List<Comment> Comments{get;set;}
    }
     public class Comment
    {
        public int CommentId { get; set; }
        public string CContent { get; set; }
        public Post Post { get; set; }
        public int PostId { get; set; }
        public Blog Blog { get; set; }
    }
    
  2. 在Post Details.cshtml中,使用ViewComponent实现评论列表

    @model Comment
    @{
     ViewData["Title"] = "Details";
     }
    <h2>Details</h2>
    
    <div>
             @await Component.InvokeAsync("Post", new { PostId = @Model.PostId })
    </div>
     @* Add Comment *@
     <div class="row">
    <div class="col-md-4">
        <form asp-action="Details" asp-controller="Posts">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <input asp-for="PostId" class="form-control" />
            <div class="form-group">
                <label asp-for="CContent" class="control-label"></label>
                <input asp-for="CContent" class="form-control" />
                <span asp-validation-for="CContent" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
    

  3. PostViewComponent页面的代码

      @model Post
      <h4> Comment List</h4>
       <div class="row">
    <div class="col-md-4">
        <form asp-action="CreateComment" asp-controller="Posts">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="PostId" class="control-label"></label>
                <input asp-for="PostId" class="form-control" />
                <span asp-validation-for="PostId" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Title" class="control-label"></label>
                <input asp-for="Title" class="form-control" />
                <span asp-validation-for="Title" class="text-danger"></span>
            </div>
        </form>
    </div>
       </div>
          @foreach (var comment in Model.Comments)
         {
    <div class="form-group">
        <label asp-for="@comment.CommentId" class="control-label"></label>
        <input asp-for="@comment.CommentId" class="form-control" />
    </div>
    <div class="form-group">
        <label asp-for="@comment.CContent" class="control-label"></label>
        <input asp-for="@comment.CContent" class="form-control" />
    </div>
      }
    
  4. PostViewComponent类的代码

      public class PostViewComponent : ViewComponent
    {
        private readonly PostCommentContext _context;
        public PostViewComponent(PostCommentContext context)
        {
            _context = context;
        }
        public async Task<IViewComponentResult> InvokeAsync(int PostId)
        {
            var items = await _context.Posts.Include(p => p.Comments)
                .FirstOrDefaultAsync(p => p.PostId == PostId);
            return View(items);
            //return View(new Comment() { PostId = Id });
        }
    }
    
  5. 获取评论列表并在PostsController中添加评论的操作

        [HttpGet("Posts/Details/{PostId}")]
    public async Task<IActionResult> Details(int? PostId)
    {
    
        var comment = new Comment { PostId = PostId.Value};
        return View(comment);
    }
    [HttpPost("Posts/Details/{PostId}")]
    public async Task<IActionResult> CreateComment(int PostId, Comment comment)
    {
        if (ModelState.IsValid)
        {
            _context.Add(comment);
            await _context.SaveChangesAsync();
    
            return View("Details", new Comment { PostId = comment.PostId });
        }
        return View("Posts/Details");
    }
    

答案 1 :(得分:-1)

我想说ViewComponents是必经之路。您可以在调用他们的Invoke方法并且他们使用自己的模型时向他们发送任何数据。