Asp.net mvc 多数据类型的自定义ValidationAttribute

Asp.net mvc 多数据类型的自定义ValidationAttribute,asp.net-mvc,validation,Asp.net Mvc,Validation,我有一个类似下面的ValidationAttribute,它验证在表单上输入了一定数量的值。目前,它仅用于类型为short?[] public class RequiredArrayLength : ValidationAttribute { public int TotalRequired { get; set; } public override bool IsValid(object value) { if(

我有一个类似下面的
ValidationAttribute
,它验证在表单上输入了一定数量的值。目前,它仅用于类型为
short?[]

public class RequiredArrayLength : ValidationAttribute
    {
        public int TotalRequired { get; set; }

        public override bool IsValid(object value)
        {
            if(value != null)
            {
                var array = value as short?[];
                return array.Where(v => v.HasValue).Count() >= TotalRequired;
            }
            return false;
        }
    }

是否有一种方法可以修改此
ValidationAttribute
,使其与其他数值数组(如
int?[

)一起工作?一个选项是强制转换到
IEnumerable
System.Collections
命名空间)并枚举集合以确定集合中的项数

public class RequiredArrayLength : ValidationAttribute
    {
        public int TotalRequired { get; set; }

        public override bool IsValid(object value)
        {
            if(value != null)
            {
                var array = value as short?[];
                return array.Where(v => v.HasValue).Count() >= TotalRequired;
            }
            return false;
        }
    }
IEnumerable collection = value as IEnumerable;
if (collection!= null)
{
    IEnumerator enumerator = collection.GetEnumerator();
    int count = 0;
    while(enumerator.MoveNext())
    {
        count++;
    }
    return count >= TotalRequired;
}
return false;
如果只想计算非空值,请将代码修改为

while(enumerator.MoveNext())
{
    if (enumerator.Current != null)
    {
        count++;
    }
}

如果您特别想将其限制为仅数字数据类型,则可以使用
IEnumerable
.GetType()
方法来测试
类型(例如,)。

一个选项是强制转换到
IEnumerable
系统.Collections
命名空间)并枚举集合以确定集合中的项目数

IEnumerable collection = value as IEnumerable;
if (collection!= null)
{
    IEnumerator enumerator = collection.GetEnumerator();
    int count = 0;
    while(enumerator.MoveNext())
    {
        count++;
    }
    return count >= TotalRequired;
}
return false;
如果只想计算非空值,请将代码修改为

while(enumerator.MoveNext())
{
    if (enumerator.Current != null)
    {
        count++;
    }
}

如果您特别想将其限制为仅数字数据类型,则可以使用
IEnumerable
.GetType()
方法来测试
类型(例如,)。

上述方法是否处理空数据类型?是的,如果
[2,null,4]
count
的结果将是3如果您只想计算非空值,那么您可以使用
if(enumerator.Current!=null){count++;}
以上是否处理空数据类型?是的,如果
value
[2,null,4]
,如果您只想计算非空值,
count
的结果将是3,然后,如果(enumerator.Current!=null){count++;}