Mvc .net密码更改

时间:2015-11-29 22:30:05

标签: c# asp.net asp.net-mvc asp.net-membership

我是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()方法作为包装器,那么就可以了。

有谁知道问题是什么。

3 个答案:

答案 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)

有可能有实体框架本地缓存,可能正在更新旧密码。执行以下步骤。

  1. 从代码中删除以下行。
  2. 更改密码
  3. 重新启动应用程序并检查密码是否已更改。
  4. 如果更改密码,则清除实体框架本地缓存(按代码)。

    注意:无需再次更新db中的密码。 ChangePassword函数直接对DB进行更改。

    enter image description here