ASP.NET Core MVC: ответы на комментарии не работают после рефакторингаC#

Место общения программистов C#
Anonymous
ASP.NET Core MVC: ответы на комментарии не работают после рефакторинга

Сообщение Anonymous »

Я работаю над проектом ASP.NET Core MVC, который включает в себя публикации и комментарии. Пользователи могут оставлять комментарии к публикациям, а также отвечать на другие комментарии. Первоначальная реализация работала (проверьте этот коммит), но после некоторого рефакторинга функция ответа перестала работать. Теперь, когда я пытаюсь ответить на комментарий, страница просто обновляется, не вызывая действия контроллера.
Предыдущая рабочая реализация:
Действие контроллера для добавления комментария:

Код: Выделить всё

[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)
}

}


PostIndexViewModel:

Код: Выделить всё

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

Вернуться в «C#»