我知道有data annotation
来验证[Required]
,[Range()]
等数据。更不用说unobtrusive validation
使客户端更容易了。非常感谢他们。
但是,如果您需要验证取决于实体属性值的值,那该怎么办?我有这种情况,说:
我的模特:
public class Schedule
{
public int Id { get; set; }
public DatetimeOffset StartDate { get; set; }
public DatetimeOffset EndDate { get; set; }
}
现在位于form
,
<input type="text" name="StartDate" />
<input type="text" name="EndDate" />
您如何确认EndDate
不应less than
StartDate
? attribute
中有内置的data annotation
吗?或者应该定制一个?如果能够使用微软的unobstrusive validation
那将会很棒。
这是另一种情况:
如果您要进行的验证取决于数据库中保存的值,该怎么办?说,
public class Bag
{
//constructor
public int Capacity { get; set; }
public virtual ICollection<Item> Items { get; set; }
}
public class Item
{
//constructor
public string Description { get; set; }
public virtual ICollection<Bag> Bags { get; set; }
}
如果您要对Items
添加Bag
进行验证,但是如果用户尝试输入超出Bag
Capacity
的限制,应该显示验证错误。
这可能吗?
我目前正在使用ASP.NET MVC 4. EF5 Code第一种方法。
答案 0 :(得分:1)
第一种方法是实施IValidatableObject
:
public class Schedule : IValidatableObject
{
public int Id { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (StartDate > EndDate)
{
yield return new ValidationResult("End date must be greater than start date.", new [] { "EndDate"});
}
}
}
它将在服务器端的模型绑定期间自动执行。
如果您想在客户端进行验证,您还可以选择。其中之一是远程验证。你可以阅读它here。总结一下:您必须创建constroller和action,它接受验证的值并返回它是否有效。它可能需要多个值。例如,如果要检查唯一性,请使用ID和用户名。
显然,在日期比较中不需要向服务器发送值。您可以实现自己的验证属性来处理客户端的比较。有人试图实现它here。