public ProductCommentPartialViewModel(ProductComment comment, ReplyCommentInputModel replyCommentInputModels, ProductRatingViewModel userProductRating, int commentCounter) { this.Comment = comment; this.UserProductRating = userProductRating; this.CommentCounter = commentCounter; this.ReplyCommentInputModel = replyCommentInputModels; }
public ProductCommentPartialViewModel(ProductComment comment, ReplyCommentInputModel replyCommentInputModels, ProductRatingViewModel userProductRating, string currentUserId, int commentCounter, int repliesCount = 0) { this.Comment = comment; this.UserProductRating = userProductRating; this.RepliesCount = repliesCount; this.CurrentUserId = currentUserId; this.CommentCounter = commentCounter; this.ReplyCommentInputModel = replyCommentInputModels; }
public IActionResult LoadReplyToComment(ReplyCommentInputModel inputModel) { return(this.PartialView("Views/Products/_ProductCommentReplyPartial.cshtml", inputModel)); }
public async Task <IActionResult> ReplyToComment(ReplyCommentInputModel inputModel, string pageFragment, string commentsPage, string commentsOrderingOption) { var productId = inputModel.ProductId; var commentId = inputModel.ParentCommentId; //Sanitize pageFragment pageFragment = this.javaScriptEncoder.Encode(pageFragment); //Sanitize commentsPage if (commentsPage != null) { commentsPage = this.htmlEncoder.Encode(commentsPage); } //Check if data is valid without looking into the database if (this.ModelState.IsValid == false) { //Store input model for passing in get action TempData["InputModelFromPOSTRequest"] = JsonSerializer.Serialize(inputModel); TempData["InputModelFromPOSTRequestType"] = nameof(ReplyCommentInputModel); //Add suitable model state error for UI validation var newModelState = new ModelStateDictionary(this.ModelState); foreach (var modelStateEntry in this.ModelState.Values) { foreach (var modelStateError in modelStateEntry.Errors) { newModelState.AddModelError($"ParentCommentId_{inputModel.CommentCounter}", modelStateError.ErrorMessage); } } //Store needed info for get request in TempData TempData["ErrorsFromPOSTRequest"] = ModelStateHelper.SerialiseModelState(newModelState); return(this.RedirectToAction("ProductPage", "Products", new { productId, commentsPage, commentsOrderingOption }, pageFragment)); } var userId = this.userService.GetUserId(this.User.Identity.Name); //Check if parent comment for this product exists if (this.productCommentService.CommentExists(commentId) == false) { this.ModelState.AddModelError($"ParentCommentId_{inputModel.CommentCounter}", "Can't reply to nonexistent comment."); } //Check if the user isn't trying to reply to himself if (this.productCommentService.CommentBelongsToUser(commentId, userId)) { this.ModelState.AddModelError($"ParentCommentId_{inputModel.CommentCounter}", "Can't reply to yourself."); } //Check if model state is valid after checking into the database if (this.ModelState.IsValid == false) { //Store input model for passing in get action TempData["InputModelFromPOSTRequest"] = JsonSerializer.Serialize(inputModel); TempData["InputModelFromPOSTRequestType"] = nameof(ReplyCommentInputModel); //Store needed info for get request in TempData only if the model state is invalid after doing the complex checks TempData["ErrorsFromPOSTRequest"] = ModelStateHelper.SerialiseModelState(this.ModelState); //Reload same page with the TempData return(this.RedirectToAction("ProductPage", "Products", new { productId, commentsPage, commentsOrderingOption }, pageFragment)); } //Create new reply comment var replyComment = new ProductComment { ProductId = productId, ParentCommentId = commentId, Text = inputModel.Text, CommentedOn = DateTime.UtcNow, UserId = userId }; await this.productCommentService.AddAsync(replyComment); return(this.RedirectToAction("ProductPage", "Products", new { productId, toReplyComment = replyComment.Id, commentsPage = commentsPage, commentsOrderingOption }, pageFragment)); }