在MVC3中相互验证模型集合

时间:2012-07-05 17:29:36

标签: asp.net-mvc-3

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

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

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

2 个答案:

答案 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>