Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么这段代码会导致创建多个实例? Visual Studio专业版2013 C#ASP.NET MVC 5 Web应用程序_C#_Asp.net_Asp.net Mvc_Multithreading_Web - Fatal编程技术网

为什么这段代码会导致创建多个实例? Visual Studio专业版2013 C#ASP.NET MVC 5 Web应用程序

为什么这段代码会导致创建多个实例? Visual Studio专业版2013 C#ASP.NET MVC 5 Web应用程序,c#,asp.net,asp.net-mvc,multithreading,web,C#,Asp.net,Asp.net Mvc,Multithreading,Web,哎, 我现在正在学习MVC。我正在做的是模拟一个博客。在这个博客上有一个评论部分,当用户填写表单并点击提交时,运行的代码会导致评论被保存到数据库中3次。如果在此之后提交另一条评论,则将添加6次。运行的是以下代码: [ValidateAntiForgeryToken()] public PartialViewResult _Submit(Comment comment) { ViewBag.ArticleID = comment.ArticleID; if (ModelStat

哎,

我现在正在学习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);
}
[ValidateAntiForgeryToken()]
公共部分咨询结果提交(评论){
ViewBag.ArticleID=comment.ArticleID;
if(ModelState.IsValid){
Exception ex=commentRepository.SaveComment(comment);
如果(ex==null){
TempData[“Message”]=“保存成功”;
}
否则{
TempData[“Message”]=“出现错误。进一步信息:”+ex.Message;
}
}
否则{
TempData[“Message”]=“出现错误。数据可能无效。”;
}
List comments=commentRepository.GetComments(comment.ArticleID);
返回PartialView(“\u GetComment”,comments);
}
用调试器检查这一点只会让我知道不断创建新线程。用更简单的版本替换代码可以解决问题,例如:

commentRepository.SaveComment(comment);
List<Comment> comments = commentRepository.GetComments(comment.ArticleID);
ViewBag.ArticleID = comment.ArticleID;
return PartialView("_GetComment", comments);    
commentRepository.SaveComment(comment);
List comments=commentRepository.GetComments(comment.ArticleID);
ViewBag.ArticleID=comment.ArticleID;
返回PartialView(“\u 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;
    }
}
BlogContext=newblogcontext();
公共列表GetComments(int articleID){
返回context.Comments.Where(p=>p.ArticleID==ArticleID.ToList();
}
//即使我总是返回null,错误仍然会发生。
公共异常保存注释(注释注释){
试一试{
context.Comments.Add(comment);
SaveChanges();
返回null;
}
捕获(例外情况除外){
退换货;
}
}

我只想知道是什么使代码按它的方式运行。

您在代码中做了一些不正确的事情,这可能会导致您的问题

  • 因为在控制器方法中没有执行任何重定向,所以应该使用ViewData或ViewBag,而不是TempData。TempData仅用于在重定向到其他控制器操作时保留信息
  • 您使用异常作为返回值,而不是抛出它们
下面是您为解决这些问题而重写的代码。我不确定它是否解决了您最初的问题,因为我没有尝试运行它,因为我没有您的数据库和上下文对象。请注意,SaveComment不使用try/catch,因为它不需要try/catch,发生的任何异常都将“冒泡”到调用例程,在那里捕获并处理它

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

BlogContext=newblogcontext();
公共列表GetComments(int articleID){
返回context.Comments.Where(p=>p.ArticleID==ArticleID.ToList();
}
公共void SaveComment(注释注释){
context.Comments.Add(comment);
SaveChanges();
}
[ValidateAntiForgeryToken()]
公共部分咨询结果提交(评论){
ViewBag.ArticleID=comment.ArticleID;
if(ModelState.IsValid){
试一试{
commentRepository.SaveComment(comment);
ViewBag.Message=“保存成功”;
}
捕获(例外情况除外){
ViewBag.Message=“发生错误。进一步信息:”+例如消息;
}
否则{
ViewBag.Message=“发生错误。数据可能无效。”;
}
List comments=commentRepository.GetComments(comment.ArticleID);
返回PartialView(“\u GetComment”,comments);
}

为什么SaveComment方法返回异常而不是抛出异常?为什么在“更简单的版本”中重新排列语句?@Jon Skeet我想这是我的“noobyness”这导致了这样一个决定:P这到底是怎么回事?@Jashaszun这没有什么特别的目的。将你的代码发布到
SaveComment
GetComments
。可能问题就在那里。谢谢你。你的代码工作得很好。我会记住你未来的提示:)在一个真正的应用程序中,我还需要补充一点你可能想把异常记录在某个地方,这样你就有了记录,有人可以在一开始就调查是什么导致了异常。但这是一个完全不同的问题,你需要单独的研究项目。
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);
}