如何根据CRUD操作插入或更新禁用或更改属性

时间:2015-05-23 19:55:09

标签: c# asp.net-mvc entity-framework validation validationattribute

我正在尝试在Visual Studio 2013.4上使用ASP.NET MVC和EntityFramework构建一个小型网站

我有这个型号:

    public Class User
    {
Public int UserID {get;set;}
        [Required]
        [ValidUserName]

        public string UserName { get; set; }

        [Required]
        public string UserPassword { get; set; }

    }

此模型具有自定义属性,称为[ValidUserName]

public class ValidUserName : ValidationAttribute
{
    PMAIDEntities db;
    public ValidUserName()
    {
        db = new PMAIDEntities();
    }
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        if (value != null)
        {

            var valueAsString = value.ToString();
            bool IsExist = db.Users.Where(x => x.UserName == (string)value).Any();
            if (IsExist)
            {
                var errorMessage = FormatErrorMessage(validationContext.DisplayName);
                return new ValidationResult("User Name is Already Exist !!");
            }                   
        }
        return ValidationResult.Success;
    }
}

问题是当我尝试向数据库添加新记录时[ValidUserName]工作正常,这会通知最终用户数据库中是否存在用户名。但是,当更改操作发生在记录上以更改密码时,[ValidUserName]会告诉我用户名存在于数据库中。 enter image description here

我知道用户名已经存在,但如何解决此问题,让[ValidUserName]接受当前用户名,因为用户名应保持原样?

这是控制器中的代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "UserID,UserName,UserPassword,UserRole,UserFullName,UserEmail,UserMobile,UserLastLogin,UserAddress,UserBio,UserNationality,UserGender,UserDOB,UserAge,UserDateAdded")] User user)
{
    if (ModelState.IsValid)
    {
        db.Entry(user).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    ViewBag.UserNationality = new SelectList(db.Nationalities, "Id", "Name", user.UserNationality);
    return View(user);
}

修改

我在模型中使用此代码

    public class User
    { 

        public int UserID { get; set; }

    [Required]
    [Remote("IsUserNameValid", "Users", AdditionalFields = "UserID", ErrorMessage = "Username already exists.")]
        [ValidUserName]
        public string UserName { get; set; }

    [Required]  
        public string UserPassword { get; set; }
}

并在控制器中添加以下代码

public JsonResult IsUsernameValid(string UserName, int UserID)
{
    var isValid = true;

    if (UserName != null)
    {
        isValid = !db.Users.Where(x => x.UserName == UserName && x.UserID != UserID).Any();
    }

    return Json(isValid, JsonRequestBehavior.AllowGet);
}

这里的问题是远程属性需要指定控制器名称,在这种情况下,如果我的控制器位于名为“Admin”的区域内,我应该写什么

1 个答案:

答案 0 :(得分:1)

您需要使用远程验证(RemoteAttribute)。将此操作方法添加到控制器(我假设您的UserID是整数):

public JsonResult IsUserNameValid(string UserName, int UserID = 0)
{
    var isValid = true; 

    if (UserName != null)
    {
        isValid = !db.Users.Where(x => x.UserName == UserName && x.UserID != UserID).Any();                         
    }

    return Json(isValid, JsonRequestBehavior.AllowGet);
}

然后,在您的模型中使用它(更新以在管理区域中调用控制器):

public class User
{
    [Required]
    [Remote("IsUserNameValid", "Users", "Admin", 
       AdditionalFields = "UserID", ErrorMessage = "Username already exists.")]
    public string UserName { get; set; }

    [Required]
    public string UserPassword { get; set; }

    // other properties...
}

您可以在asp.net MVC here中阅读有关实现远程验证的更多信息。