1

我在专业 ASP.NET MVC 1.0 书第 1 章的“处理编辑错误”(第 67 页)中遇到了问题。

问题是当我编辑晚餐并单击保存时,即使我将标题留空,它也没有捕获任何表单错误。UpdateModel(dinner) 或 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 的帮助!我很感激。

4

2 回答 2

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());
            }
于 2010-02-19T21:57:27.293 回答
0

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

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

这是论坛主题的链接,其中包含更多答案:

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

于 2010-08-15T04:06:03.610 回答