为什么这段代码会导致创建多个实例

本文关键字:创建 实例 段代码 代码 为什么 | 更新日期: 2023-09-27 18:16:04

  • Visual Studio Professional 2013
  • C#ASP.NET MVC 5 Web应用程序

嘿,

我现在正在学习MVC。我正在做的是模拟一个博客。在这个博客上有一个评论部分,当用户填写表单并点击提交时,运行的代码会导致评论被保存到数据库中3次。如果在那之后提交了另一条评论,它将被添加6次。运行以下代码:

[ValidateAntiForgeryToken()]
public PartialViewResult _Submit(Comment comment) {  
    ViewBag.ArticleID = comment.ArticleID;
    if (ModelState.IsValid) {
        Exception ex = commentRepository.SaveComment(comment);
        if (ex == null) {
            TempData["Message"] = "Saving was succesful";
        }
        else {
            TempData["Message"] = "An error occured. Further information: " + ex.Message;
        }
    }
    else {
        TempData["Message"] = "An error occured. Data may be not valid.";
    }
    List<Comment> comments = commentRepository.GetComments(comment.ArticleID);
    return PartialView("_GetComment", comments);
}

用调试器检查这一点只会让我知道不断有新的线程被创建。用更简单的版本替换代码可以解决问题,例如:

commentRepository.SaveComment(comment);
List<Comment> comments = commentRepository.GetComments(comment.ArticleID);
ViewBag.ArticleID = comment.ArticleID;
return PartialView("_GetComment", comments);    

编辑:

以下是注释库中的GET和SAVE方法:

BlogContext context = new BlogContext();
public List<Comment> GetComments(int articleID) {
    return context.Comments.Where(p => p.ArticleID == articleID).ToList();
}
//The error still occurs even if I always return null.
public Exception SaveComment(Comment comment) {
    try {
        context.Comments.Add(comment);
        context.SaveChanges();
        return null;
    }
    catch (Exception ex) {
        return ex;
    }
}

我只想知道是什么让代码以这种方式运行。

为什么这段代码会导致创建多个实例

您在代码中做了一些错误的事情,可能会导致出现问题。

  • 因为您没有在控制器方法中进行任何重定向,所以应该使用ViewData或ViewBag,而不是TempData。TempData应仅用于在重定向到其他控制器操作时保留信息
  • 您使用异常作为返回值,而不是抛出它们

以下是为解决这些问题而重写的代码。它是否解决了您最初的问题,我不确定,因为我没有尝试运行它,因为我有您的数据库和上下文对象。请注意,SaveComment不使用try/catch,因为它不需要try/catch。发生的任何异常都将"冒泡"到调用例程中,在那里它将被捕获并执行。

您还需要将视图更改为引用ViewBag.Message,而不是TempData["Message"]。

BlogContext context = new BlogContext();
public List<Comment> GetComments(int articleID) {
    return context.Comments.Where(p => p.ArticleID == articleID).ToList();
}
public void SaveComment(Comment comment) {
    context.Comments.Add(comment);
    context.SaveChanges();
}
[ValidateAntiForgeryToken()]
public PartialViewResult _Submit(Comment comment) {  
    ViewBag.ArticleID = comment.ArticleID;
    if (ModelState.IsValid) {
        try {
            commentRepository.SaveComment(comment);
            ViewBag.Message = "Saving was succesful";
        }
        catch( Exception ex ) {
            ViewBag.Message = "An error occurred. Further information: " + ex.Message;
        }
    else {
        ViewBag.Message = "An error occurred. Data may be not valid.";
    }
    List<Comment> comments = commentRepository.GetComments(comment.ArticleID);
    return PartialView("_GetComment", comments);
}