我正在尝试在 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”的区域内,我应该写什么