Asp.net mvc 4 使用数据批注验证列表中的多个依赖项

Asp.net mvc 4 使用数据批注验证列表中的多个依赖项,asp.net-mvc-4,entity-framework-5,data-annotations,Asp.net Mvc 4,Entity Framework 5,Data Annotations,我有一个用户可以选择的复选框列表。我首先使用实体框架代码保存列表。这些是我的模型: 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 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; }
}
有没有一种方法可以使用数据注释在列表中强制执行依赖关系?如果没有:在不使用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;
    }
}
显然,编译器也不喜欢这样。现在,我可以想出另一个解决方案,但我不喜欢:

[TypeDependent]
[DataMember(IsRequired = true)]
public ICollection<Type> Types { get; set; }
[类型相关]
[数据成员(IsRequired=true)]
公共ICollection类型{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;
    }
}
class TypeDependencyAttribute:ValidationAttribute
{
公共覆盖布尔值有效(对象值)
{
列表=作为列表的值;
如果(列出任何(p=>p.Naam==“BMI”))
{
如果(!list.Any(p=>p.Naam==“Lengte”)和&!list.Any(p=>p.Naam==“Gewicht”))
{
返回false;
}
}
返回true;
}
}

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

您可以根据自定义需要创建自定义数据批注

下面是一些例子


我尝试了这个方法,但似乎无法将数组传递给属性。有关更新,请参阅我的问题。您不能传递数组,但可以传递多个值。像
[依赖项(“BMI”、“长度”、“重量”)]
插入的覆盖
公共覆盖bool IsValid(对象值)
尝试覆盖
受保护覆盖验证结果IsValid(对象值、验证上下文验证上下文)
。bcos具有验证上下文,您可以使用该上下文检索传递的值。
[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;
    }
}