MVC Validator.TryValidateObject不验证自定义属性,验证Properties = true

时间:2013-06-24 16:18:32

标签: asp.net-mvc model-view-controller data-annotations

使用Validator.TryValidateObject调用validateAllProperties = true时,我的自定义验证属性不会被触发。 ValidationResult不包含我的错误属性值的条目。下面是用于测试此内容的模型,属性和代码。

//Model
public class Model
{
    [AmountGreaterThanZero]
    public int? Amount { get; set; }
}

//Attribute
public sealed class AmountGreaterThanZero: ValidationAttribute
{
    private const string errorMessage = "Amount should be greater than zero.";

    public AmountGreaterThanZero() : base(errorMessage) {  }

    public override string FormatErrorMessage(string name)
    {
        return errorMessage;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {
            if ((int)value <= 0)
            {
                var message = FormatErrorMessage(validationContext.DisplayName);
                return new ValidationResult(message);
            }
        }
        return null;
    }

    public override bool IsValid(object value)
    {
        if ((int)value < 0)
        {
            return false;
        }

        return true;
    }
}

//Validation Code
var container = new Container();
container.ModelList = new List<Model>() { new Model() { Amount = -5 } };
var validationContext = new ValidationContext(container, null, null);
var validationResults = new List<ValidationResult>();
var modelIsValid = Validator.TryValidateObject(container, validationContext, validationResults, true);

注意:如果我使用ValidationResult方法,验证工作正常,TryValidateProperty会返回正确的错误消息。

编辑:正如@Fals所建议的那样,我采用的方法是单独验证列表中的每个对象。

1 个答案:

答案 0 :(得分:2)

将@Fals的评论标记为答案,因为这是我最终采用的方法。因为没有其他问题得到满足我原来的问题。

  

@Fals - 多数问题,您必须逐个对象传递给验证!