使用数据注释验证列表中的多个依赖项

时间:2013-12-17 09:01:48

标签: asp.net-mvc-4 entity-framework-5 data-annotations

我有一个用户可以选择的复选框列表。我正在使用Entity Framework Code First保存列表。这些是我的模特:

public class Company {
    public int ID { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Type> Types { get; set; }
}

public class Type {
    public int ID { get; set; }
    public string Name { get; set; }
}

公司有一个属于它的类型列表。其中一些类型依赖于彼此。例如:名称为BMI的我的类型取决于具有名称长度和重量的类型。为了强制执行此操作,我目前正在使用jQuery,但我想在模型中处理它。我在考虑这样的事情:

[Dependency("BMI", DependsOn = { "length", "weight" })]

有没有办法使用数据注释在列表中强制执行依赖项?如果没有:在不使用jQuery的情况下强制执行这些依赖项的最佳方法是什么?

尝试一次

所以,我开始研究解决方案。到目前为止,这是我的代码:

class TypeDependencyAttribute : ValidationAttribute
{
    public string Dependant { get; set; }
    public string[] Dependencies { get; set; }

    public TypeDependencyAttribute(string dependant, string[] dependencies)
    {
        Dependant = dependant;
        Dependencies = dependencies;
    }

    public override bool IsValid(object value)
    {
        List<Isala.Models.Metingen.Type> list = value as List<Isala.Models.Metingen.Type>;
        if (list.Any(p => p.Naam == Dependant))
        {
            foreach(var dependency in Dependencies){
                if (!list.Any(p => p.Naam == dependency))
                {
                    return false;
                }
            }
        }
        return true;
    }
}

在我的模特中:

[TypeDependency("BMI", new string {"Lengte", "Gewicht"})]
[DataMember(IsRequired = true)]
public ICollection<Type> Types { get; set; }

这让我想到了下一个问题。根据{{​​3}},您无法将数组传递给验证属性。这使得我的解决方案毫无用处。

尝试两次

接下来尝试,让我们松开阵列并按照这样做:

[TypeDependency("BMI", "Lengte")]
[TypeDependency("BMI", "Gewicht")]
[DataMember(IsRequired = true)]
public ICollection<Type> Types { get; set; }

嗯,你不能,根据这个错误消息:

"Duplicate 'TypeDependency' attribute"

显然,编译器也不喜欢这样。现在,我可以想到另一个解决方案,但我不喜欢它:

[TypeDependent]
[DataMember(IsRequired = true)]
public ICollection<Type> Types { get; set; }

属性:

class TypeDependencyAttribute : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        List<Isala.Models.Metingen.Type> list = value as List<Isala.Models.Metingen.Type>;
        if (list.Any(p => p.Naam == "BMI"))
        {
            if (!list.Any(p => p.Naam == "Lengte") && !list.Any(p => p.Naam == "Gewicht"))
            {
                return false;
            }
        }
        return true;
    }
}

这是我唯一的选择吗?我可以解决这个重复的属性错误(我需要多个依赖项,BMI不是唯一的)。

1 个答案:

答案 0 :(得分:1)