Asp.net mvc 4 用于验证邮件在asp.net mvc中是否唯一的自定义属性

Asp.net mvc 4 用于验证邮件在asp.net mvc中是否唯一的自定义属性,asp.net-mvc-4,validation,Asp.net Mvc 4,Validation,我有下面的型号 public partial class OwnerData { public string firstname { get; set; } public string lastname { get; set; } [Required] [StringLength(60)] [EmailAddress] [MailNotExists] //this is a custom function public string em

我有下面的型号

public partial class OwnerData
{
    public string firstname { get; set; }
    public string lastname { get; set; }

    [Required]
    [StringLength(60)]
    [EmailAddress]
    [MailNotExists] //this is a custom function
    public string email { get; set; }
}
自定义函数MailNotExists如下所示

namespace MyApp.CustomDataAnnotations
{
    public class MailNotExists : ValidationAttribute
    {
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            DbContext db = new DbContext ();

            var user = db.Users.FirstOrDefault(u => u.email == (string)value);

            if (user == null)
                return ValidationResult.Success;
            else
                return new ValidationResult("Mail already exists");
        }
    }
}
在视图中使用该模型,用户可以通过该模型更改其邮件

 @Html.EditorForModel();
html输出也会返回到编辑器中已经存在的邮件,如果您想更改它,系统首先通过验证器[MailNotExists]检查邮件是否已经存在于数据库中,并且一切正常。唯一的问题是,如果用户不想更改邮件,只想更改firstname或lastname,然后提交表单,那么验证程序会返回一个错误,因为邮件已经存在


只有在这种特殊情况下才可以绕过验证器,有什么解决方案吗?

这有点特殊,因为我看不到主键,但我会用下一种方法将主键添加到所有者数据中

public partial class OwnerData
        {
            public int Id { get; set; }
            public string firstname { get; set; }
            public string lastname { get; set; }

            [Required]
            [StringLength(60)]
            [EmailAddress]
            [MailNotExists] //this is a custom function
            public string email { get; set; }
        }
并修改您的属性

  protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            var owner = validationContext.ObjectInstance as OwnerData;
            if(owner == null) return new ValidationResult("Model is empty");
            DbContext db = new DbContext();
            var user = db.Users.FirstOrDefault(u => u.email == (string) value && u.id != owner.Id);

            if (user == null)
                return ValidationResult.Success;
            else
                return new ValidationResult("Mail already exists");
        }

是的,对不起,我忘记了在我的示例中插入PK。事实上,在我的代码中,模型包含了很多属性,但我只是把它整理得更系统。不管怎样,你的解决方案很好用。非常感谢。