3

我有一个可变长度的人物模型列表,我使用@Html.EditorFor 为其生成表单。

public class Person
{
    public string First { get; set; }
    public string Last { get; set; }
}

验证没有人对象具有相同的名字和姓氏的最佳方法是什么?

4

2 回答 2

3

以下是验证集合中没有 2 个项目相同的最小实现:Person

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; }
}
于 2012-07-05T18:55:45.483 回答
0

如果可能,我会在表上创建一个唯一约束并在 Person insert 中拦截 DB Exception。

但是您也可以创建一个验证属性来检查现有的名字/姓氏组合。

此伪代码示例不考虑检查 First Name/Last Name combo,而只是查看一个字段 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>
于 2012-07-05T17:32:25.060 回答