Предыдущая рабочая реализация:
Действие контроллера для добавления комментария:
Код: Выделить всё
[HttpPost]
[ValidateAntiForgeryToken]
public async Task AddComment(Comment comment)
{
var user = await _userManager.GetUserAsync(User);
if (user != null)
{
comment.AuthorId = user.Id;
comment.CreatedAt = DateTime.Now;
_context.Comments.Add(comment);
await _context.SaveChangesAsync();
}
return RedirectToAction(nameof(Details), new { id = comment.PostId });
}
Код: Выделить всё
@using System.Security.Claims
@model IEnumerable
@{
ViewData["Title"] = "Posts";
}
Posts
Create New Post
@foreach (var post in Model)
{
@if (!string.IsNullOrEmpty(post.ImagePath))
{
[img]@post.ImagePath[/img]
}
@post.Title
@post.Description
Created by @post.Author?.UserName on @post.CreateDate.ToString("g")
Comments
@if (post.Comments != null && post.Comments.Any())
{
@foreach (var comment in post.Comments.Where(c => c.ParentCommentId == null))
{
@await Html.PartialAsync("_CommentPartial", comment)
}
}
else
{
No comments yet. Be the first to comment!
}
Comment:
Add Comment
@if (User.Identity.IsAuthenticated && post.AuthorId == User.FindFirstValue(System.Security.Claims.ClaimTypes.NameIdentifier))
{
Edit
Delete
}
Details
}
Код: Выделить всё
@model ArianNovinWeb.Models.Comment
@Model.Content
Posted by @Model.Author?.UserName on @Model.CreatedAt.ToString("g")
Reply
@if (Model.Replies != null && Model.Replies.Any())
{
@foreach (var reply in Model.Replies)
{
@await Html.PartialAsync("_CommentPartial", reply)
}
}
Действие контроллера для добавления комментария:
Код: Выделить всё
[HttpPost]
[ValidateAntiForgeryToken]
public async Task AddComment(int postId, string content, int? parentCommentId)
{
if (!ModelState.IsValid)
{
TempData["ErrorMessage"] = "Failed to add comment. Please try again.";
return RedirectToAction("Index", new { id = postId });
}
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
return Forbid();
}
var comment = new Comment
{
PostId = postId,
Content = content,
AuthorId = user.Id,
CreatedAt = DateTime.Now,
ParentCommentId = parentCommentId
};
_context.Comments.Add(comment);
await _context.SaveChangesAsync();
TempData["SuccessMessage"] = "Comment added successfully!";
return RedirectToAction("Index", new { id = postId });
}
Код: Выделить всё
@using System.Security.Claims
@model ArianNovinWeb.ViewModels.PostIndexViewModel
@{
ViewData["Title"] = "Post Details";
}
@if (Model.ShowShareButton)
{
No Posts Available
Be the first to share a post!
Share Post
}
else
{
@await Html.PartialAsync("_LatestItemsPartial", Model.LatestPosts)
Share Post
@if (Model.PostNavigation.PreviousPostId.HasValue)
{
Previous
}
@if (Model.PostNavigation.NextPostId.HasValue)
{
Next
}
@Model.PostNavigation.Post.Title
By: @Model.PostNavigation.Post.Author
Posted at: @Model.PostNavigation.Post.CreateDate
@if (!string.IsNullOrEmpty(Model.PostNavigation.Post.ImagePath))
{
[img]@Model.PostNavigation.Post.ImagePath[/img]
}
@Model.PostNavigation.Post.Description
@if (User.Identity.IsAuthenticated && @Model.PostNavigation.Post.AuthorId == User.FindFirstValue(System.Security.Claims.ClaimTypes.NameIdentifier))
{
Edit
Delete
}
Details
Leave a Comment
Comment:
Add Comment
Comments
@if (Model.PostNavigation.Post.Comments.Any())
{
@foreach (var comment in Model.PostNavigation.Post.Comments)
{
@await Html.PartialAsync("_CommentPartial", comment)
}
}
else
{
No comments yet.
}
}
@section Scripts {
$(document).ready(function () {
var successMessage = '@TempData["SuccessMessage"]';
if (successMessage) {
toastr.success(successMessage);
}
var errorMessage = '@TempData["ErrorMessage"]';
if (errorMessage) {
toastr.error(errorMessage);
}
});
}
Код: Выделить всё
@model ArianNovinWeb.Models.Comment
@if (Model.Author.UserName != null)
{
Post by @Model.Author.UserName at @Model.CreatedAt
}
else
{
Post by @Model.Author.Email at @Model.CreatedAt
}
@Model.Content
@Html.AntiForgeryToken()
Reply
@if (Model.Replies != null && Model.Replies.Any())
{
@foreach (var reply in Model.Replies)
{
@await Html.PartialAsync("_CommentPartial", reply)
}
}
Код: Выделить всё
using ArianNovinWeb.Models;
using ArianNovinWeb.ViewModels;
namespace ArianNovinWeb.ViewModels
{
public class PostIndexViewModel
{
public List
Posts { get; set; }
public PostNavigationViewModel PostNavigation { get; set; }
public LatestItemsVM LatestPosts { get; set; }
public bool ShowShareButton { get; set; }
}
}
Когда я отправляю ответ, представление индекса сообщений обновляется, и ничего не происходит. Метод действия AddComment никогда не вызывается, и я не могу понять, почему. В консоли браузера нет ошибок, и форма отображается правильно.
Подробнее здесь: https://stackoverflow.com/questions/787 ... efactoring