gpt4 book ai didi

c# - 当表单字段留空时,MVC2 中的 NerdDinner 表单验证 DataAnnotations 错误

转载 作者:行者123 更新时间:2023-11-30 21:20:04 25 4
gpt4 key购买 nike

平台:Windows 7 Ultimate
IDE:Visual Studio 2010 Ultimate
网络环境: ASP.NET MVC 2
数据库: SQL Server 2008 R2 Express
数据访问: Entity Framework 4
表单验证: DataAnnotations
示例应用:来自 Wrox Pro ASP.NET MVC 2 的 NerdDinner
书籍: Wrox Professional MVC 2
第 1 章的问题 - 部分: “将验证和业务规则逻辑与模型类集成”(第 33 至 35 页)

错误概要: NerdDinner 表单验证错误,DataAnnotations 和数据库空值。

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

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

帮助!对此我真的很沮丧!!我不敢相信这么简单的东西竟然不起作用???

重现错误的步骤:

  1. 将数据库字段设置为不允许 NULL (参见图片)
  2. 设置 NerdDinnerEntityModel 晚餐类字段'可空属性为 false (见图)
  3. 为 Dinner_Validation 类添加 DataAnnotations (CODE A)
  4. 创建晚餐存储库类(CODE B)
  5. 将 CREATE 操作添加到 DinnerController (CODE C)
  6. 这是发布前的空白表格(见图片)
  7. 这个空错误发生在发布一个应该是空白表格被 Dinner_Validation 类拦截数据注解。 注意错误消息说“这个属性不能设置为空值。 WTH??? (见图片)
  8. 下一个错误发生在编辑过程中过程。这是编辑 Controller 操作(代码 D)
  9. 这是故意错误的“编辑”表格测试晚餐验证的输入DataAnnotations (见图片)
  10. 发布时再次出现错误 使用空白表单字段编辑表单。发帖请求 应该被 Dinner_Validation 类 DataAnnotations 拦截。相同的 空条目错误。什么??? (见图)

查看屏幕截图:

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 下载最新版本,它仍然有相同的错误。有人可以帮助我并告诉我需要修复什么吗?谢谢 - 埃德。

最佳答案

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

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

这是包含更多答案的论坛主题的链接:
http://p2p.wrox.com/book-professional-asp-net-mvc-2/79788-constraintexception-unhandled-user-code.html#post259245

关于c# - 当表单字段留空时,MVC2 中的 NerdDinner 表单验证 DataAnnotations 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com