平台: Windows 7旗舰版
IDE: Visual Studio 2010 Ultimate
网络环境: ASP.NET MVC 2
数据库: SQL Server 2008 R2 Express
数据访问: 实体框架4
表单验证: DataAnnotations
来自Wrox Pro ASP.NET MVC 2的 示例应用程序: NerdDinner
预订 Wrox Professional MVC 2
第1章的问题 - 部分: “将验证和业务规则逻辑与模型类集成”(第33至35页)
错误提要: NerdDinner表单验证错误,包含DataAnnotations和db nulls。
当数据库字段设置为不允许空值时,示例代码中的DataAnnotations不起作用。
使用本书中的代码和从codeplex下载的示例代码发生错误。
帮助!我真的很沮丧!我无法相信这么简单的事情就行不通了
重现错误的步骤:
请参阅屏幕截图:
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);
}
我已经向Wrox和其中一位作者发送了求助请求,但没有收到任何人的回复。由于这些错误,本书的读者甚至无法继续完成第1章的其余部分。即使我从Codeplex下载最新的版本,它仍然有相同的错误。有人可以帮助我,告诉我需要修复什么?谢谢 - 埃德。
答案 0 :(得分:2)
最后找到了本书的Wrox论坛有答案。答案实际上令人惊讶。它与Visual Studio 2010中的调试器有关。
基本上只需按F5继续,一切正常。
这是论坛帖子的链接,有更多答案:
http://p2p.wrox.com/book-professional-asp-net-mvc-2/79788-constraintexception-unhandled-user-code.html#post259245
答案 1 :(得分:2)
工具 - &gt;选项 - &gt; (扩展)调试 - &gt; (常规)启用例外助手。
只是Visual Studio试图提供帮助! :)起初吓到我了......以为代码中出现了一些显示错误的东西。是的,只需恢复执行,一切都会好的。验证内部将捕获异常(此和其他内容,例如转换,范围等)并将其记录在ModelState.Errors集合中。