平臺: 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下載的示例代碼中。
幫助!我真的很沮喪!我不能相信這麼簡單的事情就是不行?
步驟來重現錯誤:
- 設置數據庫字段不允許NULL (見圖片)
- 集NerdDinnerEntityModel晚餐類字段 可爲空屬性設置爲false (見圖片)
- 添加Data_Annotations爲Dinner_Validation類(CODE A)
- 創建晚餐倉儲類(代碼B)
- 添加創建動作DinnerController (CODE C)
- 這是空白的形式發佈之前(見圖片)
- 此空發佈 空白表單時應出現錯誤,該空白表單應該由由Dinner_Validation類 DataAnnotations攔截。 注意錯誤消息 說:「這個屬性不能 設置爲空值。WTH ???(見圖片)
- 在編輯 過程中出現的一個錯誤。下面是編輯控制器 行動(CODE d)
- 這是 「編輯」 的形式與錯誤故意輸入 測試晚餐驗證 DataAnnotations (見圖)
- 錯誤發生時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下載最新版本,它仍然有相同的錯誤。有人能幫助我,告訴我需要解決什麼問題嗎?謝謝 - 埃德。