我正在尝试在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]
会告诉我用户名存在于数据库中。
我知道用户名已经存在,但如何解决此问题,让[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”的区域内,我应该写什么
答案 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中阅读有关实现远程验证的更多信息。