书呆子晚餐没有发现错误

时间:2010-02-19 21:38:28

标签: asp.net-mvc nerddinner

我正处于Professional ASP.NET MVC 1.0书籍第1章中的“处理编辑错误”(第67页),我遇到了一个问题。

问题在于,当我正在编辑晚餐并且我点击保存时,它没有捕获任何表单错误,即使我将标题留空。 UpdateModel(晚餐)或dinnerRepository.Save()都不会抛出错误。

当我在保存后检查数据库时,标题字段确实为空。如何在不抛出错误的情况下发生这种情况?

任何帮助将不胜感激。编辑以下代码:

[AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, FormCollection formValues)
    {
        Dinner dinner = dinnerRepository.GetDinner(id);

        try
        {
            UpdateModel(dinner);
            dinnerRepository.Save();
            return RedirectToAction("Details", new { id = dinner.DinnerID });
        }
        catch
        {
            foreach (var issue in dinner.GetRuleViolations())
            {
                ModelState.AddModelError(issue.PropertyName, issue.ErrorMessage);
            }

            return View(dinner);
        }            
    }

发现问题 - 事实上,我的错误是N00B。我出于某些奇怪的原因注释了以下代码:

 partial void OnValidate(ChangeAction action)
    {
        if (!IsValid)
            throw new ApplicationException("Rule violations prevent saving");
    }

难怪它没有抓住错误...... 感谢RememberMe试图提供帮助!我很感激。

2 个答案:

答案 0 :(得分:0)

在您的模型中,您是否检查过这种情况?

public IEnumerable<RuleViolation> GetRuleViolations()
        {
            if (String.IsNullOrEmpty(title.Trim()))
                yield return new RuleViolation("Dinner Title is required", "title");

            yield break;
        }

修改 看起来违规行为从未被添加,只是计算在内。试试这个:

if (ModelState.IsValid)
            {

                try
                {
                    ...
                }
                catch
                {
                    ModelState.AddModelErrors(dinner.GetRuleViolations());
                }
            }
            else
            {
                ModelState.AddModelErrors(dinner.GetRuleViolations());
            }

答案 1 :(得分:0)

最后找到了本书的Wrox论坛有答案。答案实际上令人惊讶。它与Visual Studio 2010中的调试器有关。

基本上只需按F5继续,一切正常。

以下是论坛帖子的链接,其中包含更多答案:

http://p2p.wrox.com/book-professional-asp-net-mvc-2/79788-constraintexception-unhandled-user-code.html#post261814