【问题标题】:How to create one Custom Validation Attribute for create and edit actions with different behavior如何创建一个自定义验证属性以创建和编辑具有不同行为的操作
【发布时间】:2014-02-11 05:31:12
【问题描述】:

我正在创建用于创建事件的 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;
    }
}

当我创建一个事件模型(类)的新实例时没有问题。我的自定义验证属性工作正常。如果开始日期已经开始,它会验证开始日期并阻止保存。但是,当我编辑已经创建的事件实例时(例如我更改了名称),我的验证属性不允许我保存这个新名称,因为 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");
        }

    }
}

【问题讨论】:

    标签: asp.net asp.net-mvc entity-framework ef-code-first customvalidator


    【解决方案1】:

    将您的属性放在用于创建的 ViewModel 上,并使用不同的 ViewModel 进行编辑。和/或实现IValidatableObject实现模型级验证,检查ID是否为其类型的默认值作为创建或编辑的测试:

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if (ID == Guid.Empty && this.StartDate < DateTime.Now)
        {
            yield return
                new ValidationResult("Date already started");
        }
    }
    

    【讨论】:

    • 问题是我使用Guid作为Id(不是int),所以它已经有值了
    • Guid 的默认值是Guid.Empty,因此请检查它而不是 int 的默认值。查看我的编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多