0

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

我有这个模型:

    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]告诉我用户名存在于数据库中。在此处输入图像描述

我知道用户名已经存在,但是我该如何解决这个问题来让[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”的区域内,我应该写什么

4

1 回答 1

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 中实现远程验证的更多信息。

于 2015-05-23T21:43:48.280 回答