2010-08-12 47 views
2

平臺: Windows 7旗艦版
IDE:的Visual Studio 2010旗艦版
網絡環境: ASP.NET MVC 2
數據庫: SQL Server 2008 R2 Express
數據訪問:實體框架4
表單驗證: DataAnnotations
示例應用程序:Wrox的專業MVC 2:從Wrox的臨ASP.NET MVC 2
的NerdDinner

問題與第1章 - 部分:「集成驗證和業務規則邏輯與模型類」(頁33至35)的NerdDinner表單驗證DataAnnotations ERROR在MVC2當一個表單字段爲空

ERROR梗概:的NerdDinner形式驗證錯誤與DataAnnotations和db空值。

當數據庫字段設置爲不允許空值時,示例代碼中的DataAnnotations不起作用。

錯誤發生在本書的代碼以及從codeplex下載的示例代碼中。

幫助!我真的很沮喪!我不能相信這麼簡單的事情就是不行?

步驟來重現錯誤:

  1. 設置數據庫字段不允許NULL (見圖片)
  2. 集NerdDinnerEntityModel晚餐類字段 可爲空屬性設置爲false (見圖片)
  3. 添加Data_Annotations爲Dinner_Validation類(CODE A)
  4. 創建晚餐倉儲類(代碼B)
  5. 添加創建動作DinnerController (CODE C)
  6. 這是空白的形式發佈之前(見圖片)
  7. 此空發佈 空白表單時應出現錯誤,該空白表單應該由由Dinner_Validation類 DataAnnotations攔截。 注意錯誤消息 說:「這個屬性不能 設置爲空值。WTH ???(見圖片)
  8. 在編輯 過程中出現的一個錯誤。下面是編輯控制器 行動(CODE d)
  9. 這是 「編輯」 的形式與錯誤故意輸入 測試晚餐驗證 DataAnnotations (見圖)
  10. 錯誤發生時AG ain在發佈 編輯表單時使用空白表單域。應該通過Dinner_Validation類DataAnnotations攔截髮布請求 。相同 空條目錯誤。 WTH ???(見圖片)

見截屏在:

http://www.intermedia4web.com/temp/nerdDinner/StackOverflowNerdDinnerQuestionshort.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; } 
    } 

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

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

CODE 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試圖幫助! :)起初,我也害怕了......認爲代碼中出現了一些顯示錯誤的東西。 Yeap,只要恢復執行,一切都會好的。驗證內部機制將捕獲Exception(這個和其他的,如轉換,範圍等)並將其記錄在ModelState.Errors集合中。