我是C#和MVC应用的新手。 我在MVC应用程序中更改了密码问题。
接下来的事情是,当我填写表格并输入旧密码和新密码并点击输入时,所有接缝都可以正常运行,但密码不会在数据库中更新。然后,当我从第二次尝试时,它很顺利。
[Authorize]
[HttpPost]
public ActionResult ChangePassword(ChangePasswordModel model)
{
if (ModelState.IsValid)
{
bool changePasswordSucceeded;
MembershipUser currentUser = Membership.GetUser(User.Identity.Name, true /* userIsOnline */);
changePasswordSucceeded = currentUser.ChangePassword(model.OldPassword, model.NewPassword);
if (changePasswordSucceeded)
{
var user = GetUser();
user.PasswordEntropyScore = model.PasswordEntropyScore;
var userRepo = new UserRepository(MvcApplication.DbSession);
userRepo.Update(user);
return this.RedirectToAction("ChangePasswordSuccess");
}
else
{
ModelState.AddModelError(string.Empty, "The current password is incorrect or the new password is invalid.");
}
}
return this.View(model);
}
UserRepository Update()方法在这里:
public class UserRepository : Repository<User>
{
private Logger logger;
public UserRepository(ISession sesh) : base(sesh)
{
this.logger = LogManager.GetCurrentClassLogger();
}
public new bool Update(User user)
{
if (string.IsNullOrWhiteSpace(user.UserName) || string.IsNullOrWhiteSpace(user.Email))
{
var ex = new ArgumentException("Username or Email cannot be blank");
this.logger.Error("User.Update - username or email was null/empty string.", LoggerHelper.GetErrorString(ex, user));
throw ex;
}
return base.Update(user);
}
}
和repository base.Update()方法:
public class Repository<T> : IRepository<T>
where T : Entity
{
protected readonly ISession session;
protected static Logger logger;
public Repository()
{
throw new NotImplementedException("Must instantiate repositories with an ISession");
}
public Repository(ISession sesh)
{
this.session = sesh;
logger = new LogFactory().GetCurrentClassLogger();
}
public bool Update(T entity)
{
this.session.SaveOrUpdate(entity);
this.session.Flush();
return true;
}
}
因此,当我第一次尝试更改密码时,所有这些代码都运行良好,但它确实在数据库中使用了它。然后,当我第二次尝试更改密码时,它会在数据库中更新。
如果我更改代码直接调用base.Update()方法而不是先调用UserRepostirory.Update()方法作为包装器,那么就可以了。
有谁知道问题是什么。
答案 0 :(得分:0)
您的代码中没有太多评论可以理解您的确实做了什么,但如果您使用实体框架,则可以执行以下操作:
entitymodel model= new entitymodel();
var query= model.users.first(o=>userID==inputID);
query.password=inputPassword;
model.SaveChanges();
答案 1 :(得分:0)
根据代码,我没有看到任何问题。是否可以将try catch块添加到Repository类Update Method,并在第一次尝试保存时检查是否发生了任何异常。
你可以在第一次点击Update方法之前检查是否设置了MvcApplication.DBSession
答案 2 :(得分:0)