Asp.net mvc 当前值无效时验证模型和属性

Asp.net mvc 当前值无效时验证模型和属性,asp.net-mvc,asp.net-mvc-3,validation,Asp.net Mvc,Asp.net Mvc 3,Validation,在ASP.NET MVC 3中实现验证的最佳方法是什么?如果只有在用户更改值时才会触发验证。如果当前值无效,但用户未更改,则不应触发该值。比如说 public class SomeViewModel { [Required] [Range(10, 20)] public int? SomeProperty { get; set; } public int? AnotherProperty { get; set; } } 如果用户输入的值超出范围10和20,则默

在ASP.NET MVC 3中实现验证的最佳方法是什么?如果只有在用户更改值时才会触发验证。如果当前值无效,但用户未更改,则不应触发该值。比如说

public class SomeViewModel
{
    [Required]
    [Range(10, 20)]
    public int? SomeProperty { get; set; }

    public int? AnotherProperty { get; set; }
}

如果用户输入的值超出范围10和20,则默认的ASP.NET MVC验证会在服务器和客户端上触发,不会引起干扰。但是,如果SomeProperty的当前值无效(例如25),但用户仅更改另一个属性的值,则仍然会在服务器和客户端上触发SomeProperty的验证。我们如何实现一种验证,即仅当用户未更改给定属性时,才允许该属性的现有无效值。因此,在这种情况下,如果某个属性的值为25,这是无效的,并且用户只更改另一个属性的值,则不应触发验证。如果用户将SomeProperty的值更改为25当前值以外的任何值,则应验证该值,并且不允许使用无效值。

好的,这是可能使您达到目的的验证属性

public class RangeIfNotEqualToAttribute : RangeAttribute
    {
        string otherProperty;
        public RangeIfNotEqualToAttribute(string otherProperty, int rangeStart, int rangeEnd) :base(rangeStart,rangeEnd)
        {
            this.otherProperty = otherProperty;
        }

        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var otherPropertyInfo = validationContext.GetType().GetProperty(otherProperty);
            var oldValue = (int)otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
            if (oldValue == (int)value)
                return ValidationResult.Success;
            return base.IsValid(value, validationContext);
        }
    }
它继承自RangeAttribute并返回base.IsValid,如果当前值不等于旧值,则它假定您在同一模型的其他某些属性中携带旧值。因此,要使用它,您必须在模型中进行以下更改

public class SomeViewModel
{
    public int BackupProperty{get;set;}
    [Required]
    [RangeIfNotEqualTo("BackupProperty",10, 20)]
    public int? SomeProperty { get; set; }

    public int? AnotherProperty { get; set; }
}

将模型传递到视图时,还必须将SomeProperty的值复制到BackupProperty中。此外,还必须为BackupProperty渲染一个隐藏字段,以便将其与模型一起发回。如果要实现IClientValidable以启用客户端验证,则隐藏字段也很重要。您可以在上看到类似场景中IClientValidable的实现

这种行为不是现成的。你必须自己编写代码。也许通过继承ValidationAttributeEyes,可以使用自定义验证。我想知道是否有人有一些想法或见过这样的事情。如果遗留数据库中有无效数据,但接下来要对修改的内容执行验证,则需要进行验证。