我正在关注Scott Gu的博客:here
在他的博客中,他谈到了客户端和服务器端的验证。
如何验证用户名是否已被获取,并将其作为验证错误消息显示给用户?
在斯科特的博客中,这与验证Title
是否唯一是相同的:
public class Dinner
{
public int DinnerID { get; set; }
[Required(ErrorMessage = "Please enter a Dinner Title")]
[StringLength(20, ErrorMessage = "Title is too long")]
public string Title { get; set; }
[Required(ErrorMessage = "Please enter the Date of the Dinner")]
public DateTime EventDate { get; set; }
[Required(ErrorMessage = "Please enter the location of the Dinner")]
[StringLength(30, ErrorMessage = "Address is too long")]
public string Address { get; set; }
[Required(ErrorMessage = "Please enter your email address")]
[RegularExpression(".+\\@.+\\..+", ErrorMessage = "Please enter a valid email address")]
public string HostedBy { get; set; }
public virtual ICollection<RSVP> RSVPs { get; set; }
}
我的第一个猜测是,不知何故,这是在Model Controller中完成的,这里:
//
// POST: /Home/Create
[HttpPost]
public ActionResult Create(Dinner dinner)
{
if (ModelState.IsValid)
{
nerdDinners.Dinners.Add(dinner);
nerdDinners.SaveChanges();
return RedirectToAction("Index");
}
return View(dinner);
}
因为Title
存储在数据库服务器中,所以这将是服务器端验证。
我知道如何检查Title
是否是唯一的,但我不知道如何使验证消息像使用[Required]
或[StringLength()]
这样的声明那样出现在视图中。例如,下面是我检查唯一性的方法:
[HttpPost]
public ActionResult Create(Dinner dinner)
{
if (ModelState.IsValid)
{
foreach (var existingDinner in nerdDinners.Dinners)
{
if(existingDinner.Title == dinner.Title)
{
**// TODO: display validation error message?**
}
}
nerdDinners.Dinners.Add(dinner);
nerdDinners.SaveChanges();
return RedirectToAction("Index");
}
return View(dinner);
}
使用我的想象力和魔术棒,我想创建一个名为[TitleIsUnique]
的新声明式,它的功能与其他验证声明式一样。
提前感谢您的帮助。
发布于 2012-05-12 12:20:31
您可以创建一个如上所述的自定义属性并使用IValidateObject
,但我更喜欢将错误添加到应用程序中某一层的ModelState中。
为此,您可以使用ModelState.AddModelError
如果您使用ModelState.AddModelError("Title", "Title must be unique");
,它会在Title
字段中添加一个错误。
如果您使用ModelState.AddModelError("*", "Title must be unique");
,它将为页面添加一条常规错误消息。
[HttpPost]
public ActionResult Create(Dinner dinner)
{
if (ModelState.IsValid)
{
if(nerdDinners.Dinners.Any(d => d.Title == dinner.Title))
{
ModelState.AddModelError("Title", "The title is not unique");
return View(dinner);
}
nerdDinners.Dinners.Add(dinner);
nerdDinners.SaveChanges();
return RedirectToAction("Index");
}
return View(dinner);
}
发布于 2012-05-12 05:32:40
您可能正在考虑实现自己的从CustomAttribute派生的属性。看看这篇博文http://blogs.msdn.com/b/adonet/archive/2011/05/27/ef-4-1-validation.aspx -它展示了如何验证唯一性。在post中,IValidatableObject接口用于执行验证,但是您应该能够通过创建CustomAttribute来执行验证。
https://stackoverflow.com/questions/10556767
复制相似问题