我正在创建用于创建事件的ASP.NET MVC 4 Web项目。活动有开始和结束日期。我创建了自定义验证属性,以防止在开始日期已经开始时保存事件模型(类)实例。 以下是自定义验证属性的代码:
public class NoPastDateAttribute : ValidationAttribute
{
public NoPastDateAttribute()
: base(ValidationStrings.DateStarted)
{
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
var valueDate = DateTime.Parse(value.ToString());
if (valueDate < DateTime.Now)
{
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
}
return ValidationResult.Success;
}
}
当我创建Event模型(类)的新实例时,没有问题。我的自定义验证属性工作正常。如果开始日期已经开始,它将验证开始日期并阻止保存。但是,当我编辑已经创建的Event实例时(例如我更改了Name),我的验证属性不允许我保存这个新名称,因为startdate。 (如果startdate已经开始)
这是我的活动模型(类):
public class Event
{
public Guid Id { get; set; }
public string Name { get; set; }
[NoPastDate]
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}
我该如何解决这个问题?
更新:我使用了Colin的建议并添加了IValidatableObject接口的实现,并添加了RowVersion(timeStamp)。它帮助了我,但我不确定这个解决方案的效率如何。 所以,这是我更新的课程:
public class Event : IValidatableObject
{
public Guid Id { get; set; }
public string Name { get; set; }
public byte[] RowVersion { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (RowVersion == null && this.StartDate < DateTime.Now)
{
yield return
new ValidationResult("Date already started");
}
}
}
答案 0 :(得分:1)
将您的属性放在用于创建的ViewModel上,并为Edit创建一个不同的ViewModel。和/或实现IValidatableObject
来实现模型级验证,检查ID是否是其类型的默认值,作为创建或编辑的测试:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (ID == Guid.Empty && this.StartDate < DateTime.Now)
{
yield return
new ValidationResult("Date already started");
}
}