Проверка формы 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.
Помогите! Я действительно расстроен этим!! Я не могу поверить, что что-то такое простое просто не работает???
Шаги для воспроизведения ОШИБКИ:
- Установите поля базы данных, чтобы не допускать NULL (см. Рисунок)
- Установите для свойства Nullable полей класса обедающего NerdDinnerEntityModel значение false (см. Рисунок)
- Добавить DataAnnotations для класса Dinner_Validation (КОД А)
- Создать класс хранилища Dinner (код B)
- Добавить действие CREATE в DinnerController ( код C)
- Это пустая форма перед публикацией (см. Рисунок)
- Эта нулевая ОШИБКА возникает при публикации пустой формы, которая должна быть перехвачена классом Dinner_Validation DataAnnotations. Примечание. Сообщение об ошибке говорит, что "Это свойство не может иметь нулевое значение. WTH??? (см. Рисунок)
- Следующая ОШИБКА происходит во время процесса редактирования. Вот действие Изменить контроллер (КОД D)
- Это форма "Изменить" с намеренно неправильным вводом для проверки аннотаций данных проверки ужина (см. Рисунок)
- ОШИБКА возникает снова при публикации формы редактирования с пустыми полями формы. Запрос на публикацию должен быть перехвачен классом 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