DataAnnotations [Обязательный] Атрибут не вызывает исключение - PullRequest
0 голосов
/ 24 июля 2010

У меня есть приложение Asp.NET MVC, в котором я использую аннотации данных для добавления проверки в некоторые поля:

    [Required]
    [DisplayName("Course Name")]
    string Name { get; set; }

Однако, похоже, это не работает так, как я ожидал.В основном, если страница содержит любые другие ошибки, которые я вручную проверяю и выдает новое RuleViolation (), то требуемое нарушение отображается в Сводке проверки.Если требуемое нарушение является единственной ошибкой, то она не отображается.

Мой контроллер содержит следующий код:

        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
            ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
            return View(courseViewModel);
        }

Но, учитывая, что требуемое нарушение не выдает, я никогда не уйдуздесь.

Нужно ли делать что-то, о чем я не знаю, чтобы перехватывать ошибки, вызванные нарушением DataAnnotation?

Спасибо за любую помощь

Редактировать:

Вот действие контроллера:

    [HttpPost]
    [ValidateInput(true)]
    public ActionResult Edit(int id, CourseViewModel courseViewModel)
    {

        var oldCourse = _eCaddyRepository.GetCourse(id);

        if (courseViewModel.Course == null)
        {
            return View("NotFound", string.Format("Course {0} Not Found", id));
        }

        try
        {
            courseViewModel.Update(oldCourse);
            _eCaddyRepository.SubmitChanges();

            return RedirectToAction("Index", "Course");
        }
        catch (Exception ex)
        {
            ModelState.AddModelError("", ex.Message);
            ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
            return View(courseViewModel);
        }
    }

Где обновление:

    public class CourseViewModel : BaseViewModel
{
    public Course Course { get; set; }

    public void Update(Course oldCourse)
    {
        oldCourse.Name = this.Course.Name != null ? this.Course.Name.Trim() : string.Empty;
        oldCourse.Postcode = this.Course.Postcode != null ? this.Course.Postcode.Trim() : string.Empty;

        for (var i = 0; i < 18; i++)
        {
            oldCourse.Holes[i].Par = this.Course.Holes[i].Par;
            oldCourse.Holes[i].StrokeIndex = this.Course.Holes[i].StrokeIndex;
        }
    }
}

РЕДАКТИРОВАТЬ: окончательный код, который работает и проверяется в соответствии с ожиданиями, используя аннотации данных.Благодаря Маре.

    [HttpPost]
    [ValidateInput(true)]
    public ActionResult Edit(int id, CourseViewModel courseViewModel)
    {
        var oldCourse = _eCaddyRepository.GetCourse(id);

        if (courseViewModel.Course == null)
        {
            return View("NotFound", string.Format("Course {0} Not Found", id));
        }

        if (ModelState.IsValid)
        {
            try
            {
                courseViewModel.Update(oldCourse);
                _eCaddyRepository.SubmitChanges();
                return RedirectToAction("Index", "Course");
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", ex.Message);
            }
        }

        // Return Model with errors
        ModelState.AddRuleViolations(courseViewModel.Course.GetRuleViolations());
        return View(courseViewModel);
    }

Ответы [ 3 ]

3 голосов
/ 25 июля 2010

Интересно, как никто не указал на это (jfar был близок, но его формулировка была отключена, поэтому chrisp_68, вероятно, не понял, что имел в виду jfar при нарушениях состояния модели), но вы упускаете это из своего контроллера:

        if (ModelState.IsValid) // this check for model validity, not try..catch block
        {
            // do your stuff here, update to the datastore and return another view
        }

        // you can add additional Model State errors here manually if you wish
        // with AddModelError() like you do it now
        return View(editing); // return the same view with errors

Так что вам нужна проверка ModelState.IsValid, потому что DataAnnotations не будет выполнять какое-либо исключение самостоятельно.

EDIT: На самом деле, если быть точным, DataAnnotations не генерируют исключение, потому что это будетерунда, если они сделали, потому что это нарушит выполнение вашего приложения, что, конечно, вы не хотите.Вы хотите вернуться к тому же представлению и дать пользователю возможность исправить свои ошибки.

С другой стороны, у вас все еще может быть блок try..catch внутри if (ModelState.IsValid), чтобы перехватить REAL исключение, например, невозможность записи на диск или невозможность сохранения в базе данных или вставка нулей в столбцы БД, где нулевые значения не разрешены, и т. Д. И т. Д.

HTH

1 голос
/ 24 июля 2010

В MVC2 нет ничего, что вызывало бы исключение из-за поля [Обязательное].

Вот и все нарушения модели.Почти наверняка исключения генерируются только из ручного вызова ModelBinder, когда вы пытаетесь привязать «Джоэл Этвуд» к полю DateTime.

0 голосов
/ 24 июля 2010

В свойство класса добавляется аннотация данных, пространство имен должно быть "YouProject.Model"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...