Проверка формы NerdDinner DataAnnotations ERROR в MVC2, когда поле формы оставлено пустым

Платформа: Windows 7 Ultimate
IDE: Visual Studio 2010 Ultimate
Веб-среда: ASP.NET MVC 2
База данных: SQL Server 2008 R2 Express
Доступ к данным: Entity Framework 4
Проверка формы: аннотации данных
Пример приложения: NerdDinner из Wrox Pro ASP.NET MVC 2
Книга: Wrox Professional MVC 2
Проблема с главой 1 - раздел "Интеграция логики валидации и бизнес-правил с классами моделей" (стр. 33–35)

ОШИБКА Краткий обзор: ОШИБКА проверки формы NerdDinner с DataAnnotations и значениями db.

DataAnnotations в примере кода не работает, если в полях базы данных задано недопустимое значение NULL.

ОШИБКА происходит с кодом из книги и с примером кода, загруженного из codeplex.

Помогите! Я действительно расстроен этим!! Я не могу поверить, что что-то такое простое просто не работает???

Шаги для воспроизведения ОШИБКИ:

  1. Установите поля базы данных, чтобы не допускать NULL (см. Рисунок)
  2. Установите для свойства Nullable полей класса обедающего NerdDinnerEntityModel значение false (см. Рисунок)
  3. Добавить DataAnnotations для класса Dinner_Validation (КОД А)
  4. Создать класс хранилища Dinner (код B)
  5. Добавить действие CREATE в DinnerController ( код C)
  6. Это пустая форма перед публикацией (см. Рисунок)
  7. Эта нулевая ОШИБКА возникает при публикации пустой формы, которая должна быть перехвачена классом Dinner_Validation DataAnnotations. Примечание. Сообщение об ошибке говорит, что "Это свойство не может иметь нулевое значение. WTH??? (см. Рисунок)
  8. Следующая ОШИБКА происходит во время процесса редактирования. Вот действие Изменить контроллер (КОД D)
  9. Это форма "Изменить" с намеренно неправильным вводом для проверки аннотаций данных проверки ужина (см. Рисунок)
  10. ОШИБКА возникает снова при публикации формы редактирования с пустыми полями формы. Запрос на публикацию должен быть перехвачен классом DataAnnotations Dinner_Validation. Та же нулевая ошибка ввода. WTH??? (См. Рисунок)

Смотрите скриншоты по адресу:

http://www.intermedia4web.com/temp/nerdDinner/StackruNerdDinnerQuestionshort.png

КОД А:

    [MetadataType(typeof(Dinner_Validation))]
    public partial class Dinner { }

    [Bind(Include = "Title, EventDate, Description, Address, Country, ContactPhone, Latitude, Longitude")] 
    public class Dinner_Validation
    {
        [Required(ErrorMessage = "Title is required")]
        [StringLength(50, ErrorMessage = "Title may not be longer than 50 characters")]
        public string Title { get; set; }

        [Required(ErrorMessage = "Description is required")]
        [StringLength(265, ErrorMessage = "Description must be 256 characters or less")]
        public string Description { get; set; }

        [Required(ErrorMessage="Event date is required")]
        public DateTime EventDate { get; set; }

        [Required(ErrorMessage = "Address is required")]
        public string Address { get; set; }

        [Required(ErrorMessage = "Country is required")]
        public string Country { get; set; }

        [Required(ErrorMessage = "Contact phone is required")]
        public string ContactPhone { get; set; }

        [Required(ErrorMessage = "Latitude is required")]
        public double Latitude { get; set; }

        [Required(ErrorMessage = "Longitude is required")]
        public double Longitude { get; set; }
    }

КОД Б:

    public class DinnerRepository
    {
        private NerdDinnerEntities _NerdDinnerEntity = new NerdDinnerEntities();

        // Query Method
        public IQueryable<Dinner> FindAllDinners()
        {
            return _NerdDinnerEntity.Dinners;
        }

        // Query Method
        public IQueryable<Dinner> FindUpcomingDinners()
        {
            return from dinner in _NerdDinnerEntity.Dinners
                   where dinner.EventDate > DateTime.Now
                   orderby dinner.EventDate
                   select dinner;
        }

        // Query Method
        public Dinner GetDinner(int id)
        {
            return _NerdDinnerEntity.Dinners.FirstOrDefault(d => d.DinnerID == id);

        }

        // Insert Method
        public void Add(Dinner dinner)
        {
            _NerdDinnerEntity.Dinners.AddObject(dinner);
        }

        // Delete Method
        public void Delete(Dinner dinner)
        {
            foreach (var rsvp in dinner.RSVPs)
            {
                _NerdDinnerEntity.RSVPs.DeleteObject(rsvp);
            }

            _NerdDinnerEntity.Dinners.DeleteObject(dinner);
        }

        // Persistence Method
        public void Save()
        {
            _NerdDinnerEntity.SaveChanges();
        }
    }

КОД С:

        // **************************************
        // GET: /Dinners/Create/
        // **************************************
        public ActionResult Create()
        {
            Dinner dinner = new Dinner() { EventDate = DateTime.Now.AddDays(7) };
            return View(dinner);
        }

        // **************************************
        // POST: /Dinners/Create/
        // **************************************
        [HttpPost]
        public ActionResult Create(Dinner dinner) {
            if (ModelState.IsValid) 
            {               
                dinner.HostedBy = "The Code Dude";
                _dinnerRepository.Add(dinner);
                _dinnerRepository.Save();
                return RedirectToAction("Details", new { id = dinner.DinnerID });
            }
            else
            {
                return View(dinner);   
            }
        }

КОД D:

        // **************************************
        // GET: /Dinners/Edit/{id}
        // **************************************
        public ActionResult Edit(int id)
        {
            Dinner dinner = _dinnerRepository.GetDinner(id);
            return View(dinner);
        }

        // **************************************
        // POST: /Dinners/Edit/{id}
        // **************************************
        [HttpPost]
        public ActionResult Edit(int id, FormCollection formValues)
        {
            Dinner dinner = _dinnerRepository.GetDinner(id);
            if (TryUpdateModel(dinner)){
                _dinnerRepository.Save();
                return RedirectToAction("Details", new { id=dinner.DinnerID });
            }
            return View(dinner);
        }

Я послал Wrox и одному из авторов запрос о помощи, но не получил ответа ни от кого. Из-за этих ошибок читатели книги не могут даже продолжать читать оставшуюся часть главы 1. Даже если я загружаю последнюю версию из Codeplex, она все равно имеет те же ошибки. Может кто-нибудь, пожалуйста, помогите мне и скажите, что нужно исправить? Спасибо - ред.

2 ответа

Сервис -> Параметры -> (развернуть) Отладка -> (Общие) Включить помощник по исключениям.

Это просто Visual Studio пытается помочь!:) Сначала тоже напугал меня... подумал, что в коде что-то не так, как надо. Да, просто возобновить исполнение, и все будет хорошо. Внутренние компоненты проверки будут перехватывать исключение (это и другие, такие как преобразование, диапазон и т. Д.) И регистрировать его в коллекции ModelState.Errors.

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

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

Вот ссылка на ветку форума с дополнительными ответами:
http://p2p.wrox.com/book-professional-asp-net-mvc-2/79788-constraintexception-unhandled-user-code.html

Другие вопросы по тегам