Nerd Dinner не ловит ошибки - PullRequest
       16

Nerd Dinner не ловит ошибки

1 голос
/ 20 февраля 2010

Я нахожусь в разделе «Обработка ошибок редактирования» (стр. 67) в главе 1 книги Professional ASP.NET MVC 1.0, и у меня возникла проблема.

Проблема в том, что когда я редактирую ужин и нажимаю кнопку «Сохранить», он не улавливает никаких ошибок формы, хотя я оставил заголовок пустым. Ни UpdateModel (ужин), ни ужинRepository.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 голосов
/ 15 августа 2010

Наконец-то нашел форум Wrox для этой книги, в котором есть ответ.Ответ на самом деле удивителен.Это как-то связано с отладчиком в Visual Studio 2010.

По сути, просто нажмите F5, чтобы продолжить, и все работает нормально.:

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

0 голосов
/ 20 февраля 2010

В вашей модели у вас есть проверка для этого условия?

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());
            }
...