MVC Custom dataannotation

自古美人都是妖i 提交于 2019-12-25 03:38:11

问题


i create two custom dataannotation for this class as follow

public class users
{
    public int Id { set; get; }
    [Required(ErrorMessage = "username is Required")]
    [usernameValidation(ErrorMessage= "Sorry this name is already exist")]
     // [MaxLength(ma)]
    public string username { set; get; }

    [Required(ErrorMessage = "Password is required")]
    [DataType(DataType.Password)]
    public string password { set; get; }

    [Required(ErrorMessage = "Confirm Password is required")]
    [StringLength(255, ErrorMessage = "Must be between 5 and 255 characters", MinimumLength = 5)]
    [DataType(DataType.Password)]
    [Compare("password")]
    public string confirmPassword { set; get; }

    [Required(ErrorMessage = "email is required")]
    [DataType(DataType.EmailAddress)]
    [emailValidation(ErrorMessage = "Sorry this e-mail is already exist")]
    public string email { set; get; }

    [Required]
    public int type { set; get; }

    public string photopath { set; get; }

    [DataType(DataType.MultilineText)]
    public string address { set; get; }

    [DataType(DataType.MultilineText)]
    public string note { set; get; }
}

and the custom class is

public class emailValidation : ValidationAttribute
{
    db_context db = new db_context();
    public override bool IsValid(object value)
    {
        int query = (from res in db.users
                     where res.email == value.ToString() 
                     select res).Count();
        if (query == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

and other is

public class usernameValidation : ValidationAttribute
{
    db_context db = new db_context();
    public override bool IsValid(object value)
    {
        int query = (from res in db.users
                     where res.username == value.ToString() 
                     select res).Count();
        if (query == 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

this annotation worked well when i create new user,

but the problem is when i update users and didn't update username or email my custom annotation Executed, then i gives me error because username and email already exist in database.


回答1:


Your custom ValidationAttribute classes are simply checking if any users have the same username or email, which includes the current user, which causes validation to fail in the edit scenario. Since you are attempting to prevent duplicate username and email, the implementation needs to be aware of the Id of the user it is saving.

The simplest way to do this is via DbContext.ValidateEntity, since it looks like you are using Entity Framework. If you are not using Entity Framework, you can use ValidationContext in ValidationAttribute.IsValid in MVC. See http://odetocode.com/blogs/scott/archive/2011/02/21/custom-data-annotation-validator-part-i-server-code.aspx



来源:https://stackoverflow.com/questions/32804112/mvc-custom-dataannotation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!