我有用户创建的页面,显然我不希望我的用户拥有相同的用户名,所以我为此创建了验证,但是我现在编辑用户时遇到问题。当我尝试编辑用户时,它不允许我这样做,因为它说用户名已经被占用。但我什至不想编辑用户名,只是密码什么的。
编辑:我确实通过调用犯了错误ValidateModel()
,现在我解决了这个问题,但仍然遇到问题。
验证器
public class UniqueUsername : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null) return true; // In Edit view you can't edit username so it's null
FinanceDataContext _db = new FinanceDataContext();
var user = _db.Users.ToList().Where(x => x.Username.ToLower() == value.ToString().ToLower()).SingleOrDefault();
if (user == null) return true;
return false;
}
}
模型
public class User
{
public int ID { get; set; }
// When I remove UniqueUsername and Remote validators everything works just fine
[Required]
[UniqueUsername(ErrorMessage = "Username is already taken")]
[Remote("CheckUsername", "User", null, ErrorMessage = "Username is allready taken", HttpMethod = "POST")]
public string Username { get; set; }
[Required]
public string Password { get; set;}
}
行动
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit(User u)
{
// Get user we want to edit
var user = _db.Users.Where(x => x.ID == u.ID).SingleOrDefault();
if (user == null) return HttpNotFound();
// Set new fields manually
if (!string.IsNullOrEmpty(u.Password)) user.Password = Infrastructure.Encryption.SHA256(u.Password);
ModelState.Remove("Username"); // this doesen't seem to do much...
_db.SaveChanges(); // validation error here
return Content(Infrastructure.Helper.SerializeObject(u));
}
错误
一个或多个实体的验证失败。有关更多详细信息,请参阅“EntityValidationErrors”属性。
我知道为什么它会给我带来错误。因为他检查用户名是否已经被使用,当然它已经被使用,但我想验证用户名是否只在 CREATE 上使用,而不是在 EDIT 上(因为你不能更改你的用户名)