Проверка формы NerdDinner DataAnnotations ERROR в MVC2, когда поле формы оставлено пустым - PullRequest
2 голосов
/ 12 августа 2010

Платформа: 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 null.

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

Произошла ошибка с кодом из книги и с примером кода, загруженного из codeplex.

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

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

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

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

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

КОД A:

    [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; }
    }

КОД B:

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

КОД C:

        // **************************************
        // 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);
        }

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

Ответы [ 2 ]

2 голосов
/ 23 декабря 2010

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

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

2 голосов
/ 15 августа 2010

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

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

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

...