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。事实上,在我的代码中,模型包含了很多属性,但我只是把它整理得更系统。不管怎样,你的解决方案很好用。非常感谢。