我有以下型号
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");
}