C# 当表单字段留空时,MVC2中出现NerdDinner表单验证DataAnnotations错误

C# 当表单字段留空时,MVC2中出现NerdDinner表单验证DataAnnotations错误,c#,asp.net-mvc-2,null,data-annotations,nerddinner,C#,Asp.net Mvc 2,Null,Data Annotations,Nerddinner,平台:Windows7Ultimate IDE:VisualStudio2010终极版 Web环境:ASP.NET MVC 2 数据库:SQL Server 2008 R2 Express 数据访问:实体框架4 表单验证:数据注释 示例应用程序:来自Wrox Pro ASP.NET MVC 2的NerdDinner 书籍:Wrox Professional MVC 2 第1章的问题-章节:“将验证和业务规则逻辑与模型类集成”(第33至35页) 错误简介:NerdDinner表单验证错误,带有Da

平台:Windows7Ultimate
IDE:VisualStudio2010终极版
Web环境:ASP.NET MVC 2
数据库:SQL Server 2008 R2 Express
数据访问:实体框架4
表单验证:数据注释
示例应用程序:来自Wrox Pro ASP.NET MVC 2的NerdDinner
书籍:Wrox Professional MVC 2
第1章的问题-章节:“将验证和业务规则逻辑与模型类集成”(第33至35页)

错误简介:NerdDinner表单验证错误,带有DataAnnotation和db null

当数据库字段设置为不允许空值时,示例代码中的DataAnnotation不起作用

书中的代码和从codeplex下载的示例代码出错

救命!我真的为此感到沮丧!!我真不敢相信这么简单的事情竟然不起作用???

重现错误的步骤:

  • 将数据库字段设置为不允许空值(参见图片)
  • 设置NerdInRenentItyModel晚餐类字段' 可为null的属性为false(见图)
  • 为验证类添加数据注释(代码A)
  • 创建晚餐存储库类(代码B)
  • 将创建操作添加到DinnerController(代码C)
  • 这是发帖前的空白表格(见图)
  • 过帐时发生此空错误 空白表格 被晚餐确认课截获 数据注释。注意错误消息 表示“此属性不能为空。” 设置为空值。WTH???(见图)
  • 下一个错误发生在编辑过程中 这是编辑控制器 动作(代码D)
  • 这是故意错误的“编辑”表格 测试验证的输入 数据注释(见图)
  • 过帐时再次发生错误 编辑带有空白表单字段的表单。post请求 应该被验证类DataAnnotations拦截。相同 空输入错误。什么?(见图)
  • 请参见以下位置的屏幕截图:

    代码A:

    代码B:

    代码D:


    我已经向Wrox和其中一位作者发出了帮助请求,但没有收到任何人的回复。由于这些错误,本书的读者甚至无法继续完成第1章的其余部分。即使我从Codeplex下载了最新版本,它仍然有相同的错误。有人能帮我,告诉我需要修复什么吗?谢谢-Ed.

    终于找到了这本书的Wrox论坛,找到了答案。答案确实令人惊讶。它与Visual Studio 2010中的调试器有关

    基本上只要按F5继续,一切正常

    这里是论坛帖子的链接,有更多答案:

    工具->选项->(展开)调试->(常规)启用异常助手

    这只是Visual Studio试图提供帮助!:)一开始也吓了我一跳……我还以为代码中出现了一些错误。是的,只要继续执行,一切都会好起来。验证内部将捕获异常(此异常以及其他异常,如转换、范围等)并将其记录在ModelState.Errors集合中

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