我有一个可变长度的人物模型列表,我使用@ Html.EditorFor来生成表单。
public class Person
{
public string First { get; set; }
public string Last { get; set; }
}
验证没有人对象具有相同的名字和姓氏的最佳方法是什么?
答案 0 :(得分:3)
以下是验证Person
集合中没有2个项目相同的 最小 实现:
public class NoDuplicatePersonsAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
var people = value as IList<Person>;
int count = people.Count();
if (people == null) return true;
for (int x = 0; x < count; x++)
{
for (int y = 0; y < count; y++)
{
if (x != y &&
people[x].FirstName == people[y].FirstName &&
people[x].LastName == people[y].LastName)
return false;
}
}
return true;
}
}
public class IndexViewModel
{
[NoDuplicatePersons]
public IList<Person> People { get; set; }
}
public class Person
{
public string FirstName{ get; set; }
public string LastName { get; set; }
}
答案 1 :(得分:0)
我会在表上创建一个唯一约束,并在可能的情况下拦截Person插入中的DB Exception。
但您也可以创建验证属性来检查现有的名字/姓氏组合。
此伪代码示例不考虑检查名字/姓氏组合,而只是查看一个字段NAME,作为您的问题的自定义验证示例。
创建自定义验证属性:
public class NameAttribute : ValidationAttribute, IClientValidatable
{
//Validate logic
}
在模型中,使用自定义验证属性并包含错误消息:
public class Person
{
[Required]
[Name (ErrorMessage = "This name already exists.")]
[Display(Name = "Name")]
public string Name { get; set; }
}
查看:
<div class="editor-field">
@Html.TextBoxFor(m => m.Name)
@Html.ValidationMessageFor(m => m. Name)
</div>