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

我有以下型号

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]检查邮件是否已经存在于数据库中,一切正常.唯一的问题是,如果用户不想更改邮件但只想更改名字或姓氏,然后提交表单,验证程序将返回错误,因为邮件已存在.

关于如何仅在特定情况下绕过验证器的任何解决方案?

最佳答案 好吧它有点具体,因为我没有看到主键,但我会这样做下一步添加主键到所有者数据

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");
        }
点赞