比方说,我有一篇博客文章,其中包含适当的视图模型(文章的内容,撰写者等)。页面中的所有内容都绑定到该视图模型。然后,在底部,我有一个注释部分,其中使用@foreach循环呈现注释。
如果有人要发布新评论,我该如何将标签发布到正确的操作中以添加他们的新评论?我已经考虑过在视图模型中添加一个“ NewComment”字段,并在发布时检查该字段以查看其中是否包含任何内容,并据此采取相应的措施,但是感觉很麻烦。如果我可以为标签定义一个新的@model,我觉得可以用,但是据我所知我不能这样做。
正确的方法是什么?
答案 0 :(得分:1)
您可以尝试ViewComponent
,详细步骤如下:
定义帖子类和评论类是一对多关系
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; }
}
在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>
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>
}
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 });
}
}
获取评论列表并在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方法并且他们使用自己的模型时向他们发送任何数据。