0

我无法执行依赖于另一个字段的数据类型验证。我在这里找到的大多数示例都是基于另一个字段的值来使字段成为必需或不MaidenName必需(仅当IsMarriedis时才需要true)。

我的模特

public class AttributeValuesModel
{
    public IList<AttributeModel> Values {get; set;}
}

public class AttributeModel
{
    [Required]
    public string AttributeName {get; set;}

    [Required]
    public string AttributeValue {get; set;}

    [Required]
    public int DataTypeId {get; set;}
}

我想做的是根据 DataTypeId 的值验证 AttributeValue 的用户输入。为了清楚起见,DataTypeId我什至在向用户显示视图之前就知道 的值。

    //Possible values for DataTypeId are 
    //1 for decimal
    //2 for dates
    //3 for integer

这可能吗?

4

2 回答 2

1

您可以查看FoolProofASP.NET MVC 的验证扩展。它们包含验证属性,可用于执行条件验证,例如[RequiredIf].

还有一个更强大的验证库(也是我使用和推荐的)是FluentMVC. 与验证数据注释相反,此库允许您执行命令式验证而不是声明式验证。这允许您表达任意复杂性和依赖属性之间的规则。

于 2013-01-23T16:19:05.437 回答
0

推出自己的验证属性并不难。我前段时间实施了一个。它检查其他属性的值是否小于使用此属性修饰的属性:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited=true)]
public class SmallerThanAttribute : ValidationAttribute
{
    public SmallerThanAttribute(string otherPropertyName)
    {
        this.OtherPropertyName = otherPropertyName;
    }

    public string OtherPropertyName { get; set; }
    public string OtherPropertyDisplayName { get; set; }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return IsValid(OtherPropertyName, value, validationContext);
    }

    private ValidationResult IsValid(string otherProperty, object value, ValidationContext validationContext)
    {
        PropertyInfo otherPropertyInfo = validationContext.ObjectType.GetProperty(otherProperty);

        if (otherPropertyInfo == null)
        {
            throw new Exception("Could not find property: " + otherProperty);
        }

        var displayAttribute = otherPropertyInfo.GetCustomAttributes(typeof(DisplayAttribute), true).FirstOrDefault() as DisplayAttribute;

        if (displayAttribute != null && OtherPropertyDisplayName == null)
        {
            OtherPropertyDisplayName = displayAttribute.GetName();
        }

        object otherPropertyValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);

        var smaller = (IComparable) value;
        var bigger = (IComparable) otherPropertyValue;

        if (smaller == null || bigger == null)
        {
            return null;
        }

        if (smaller.CompareTo(bigger) > 0)
        {
            return new ValidationResult(string.Format(ValidatorResource.SmallerThan, validationContext.DisplayName, OtherPropertyDisplayName));
        }

        return null;
    }
}

有一个问题。错误消息格式在资源类属性 (ValidatorResource.SmallerThan) 中定义,因此它不可插入——我不需要这个。但是,我认为这对您来说仍然是一个很好的起点。

于 2013-01-23T19:09:29.287 回答