我有一个用户可以选择的复选框列表。我正在使用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不是唯一的)。
答案 0 :(得分:1)