嗨,
我正在学习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;
}
}
我只是想知道是什么让代码按照它的方式运行。
答案 0 :(得分:1)
您在代码中做了一些不正确的事情可能导致您的问题。
这是为了解决这些问题而重写的代码。它是否解决了你原来的问题我不确定因为我没有尝试运行它,因为我没有你的数据库和上下文对象。请注意,SaveComment不使用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);
}