首先针对上一次的密码登录做一个补充说明,我们知道在控制器方法汇总使用过滤器[UserAuthorize]做为登录验证非常方便,验证是否成功,然后进行页面跳转,如果验证不成功我要给他们设定一个跳转页面,我们需要在config中做如下配置:

    
      
    

修改loginUrl跳转的页面即可。

    用户登录密码修改步骤如下:

    一、模板的定义

    ///     /// 修改密码    ///     [NotMapped]    public class SysComUserPassword    {        ///         /// 原密码        ///         [Display(Name="原密码",Description="6-20字符")]        [Required(ErrorMessage="×")]        [StringLength(20,MinimumLength=6,ErrorMessage="×")]        [DataType(DataType.Password)]        public string Password { get; set; }        ///         /// 新密码        ///         [Display(Name="新密码",Description="6-20字符")]        [Required(ErrorMessage="×")]        [StringLength(20,MinimumLength=6,ErrorMessage="×")]        [DataType(DataType.Password)]               public string NewPassword { get; set; }        ///         /// 确认密码        ///         [Display(Name = "确认密码", Description = "再次输入密码")]        [Compare("NewPassword", ErrorMessage = "×")]        [DataType(DataType.Password)]        public string RNewPassword { get; set; }    }

    二、Contraller的Action编写

       ///         /// 修改密码页面        ///         /// 
        [UserAuthorize]        public ActionResult UserChangePassword()        {            return View();        }        ///         /// 修改密码数据        ///         /// 
修改密码实体数据        /// 
URL
        [HttpPost]        [UserAuthorize]//Extensionsh中对UserAuthorizeAttribute扩展重写AuthorizeCore():表示这是一个只处理那些通过身份验证的URL请求,如果没有通过身份验证就请求这个Action会被带到登录页面。        public ActionResult UserChangePassword(SysComUserPassword userPassword)         {            int _rnum = userRpy.Authentication(LoginName, userPassword.Password);            if (_rnum == 0)            {                //读取用户信息                var _user = userRpy.Find(LoginName);                if (_user == null)                {                    ModelState.AddModelError("Message", "该用户已经失效,请重新登录!");                    return View();                }                else                {                    _user.Password = userPassword.NewPassword;                    if (userRpy.Update(_user))                    {                        ModelState.AddModelError("Message", "修改成功!");                        return View();                    }                    else                    {                        ModelState.AddModelError("Message", "更新数据库失败!");                        return View();                      }                }            }            else            {                ModelState.AddModelError("Message", "原密码不正确,请重新输入!");                return View();                }        }        public string LoginName         {            get             {                HttpCookie _cookie = HttpContext.Request.Cookies["user"];                if (_cookie == null) return "";                else return _cookie["loginname"];            }        }

    在这里增加Public string LoginName属性,主要用于从cookie中读取登录名称。重要方法有以下几个:

        1、 验证原始的登录名和密码是否正确,尽管我们[UserAuthorize]做了一次身份验证,但是这里目标是为了让用户重新输入一次原始密码进行验证,否则是不允许修改的:

        userRpy.Authentication(LoginName, userPassword.Password);

        2、 读取当前登录名在数据库的全部信息:

        var user = userRpy.Find(LoginName)

        3、将新设置的密码赋给读取后的实体对象,并作更新:

        _user.Password = userPassword.NewPassword;

        userRpy.Update(_user))

    三、业务逻辑层的方法定义

        1、修改一条用户信息

        ///         /// 修改一条用户信息        ///         /// 
用户数据模型        /// 
布尔值
        public override bool Update(SysComUser Tmodel)        {            //if (Tmodel == null) { return false; }            //var _tmodel = HillstoneContext.SysComUser.FirstOrDefault(u => u.UserId == Tmodel.UserId);            //if (_tmodel == null) { return false; }            //_tmodel = Tmodel;            //if (HillstoneContext.SaveChanges() > 0)            dbContext.SysComUser.Attach(Tmodel);            dbContext.Entry
(Tmodel).State = EntityState.Modified;            if (dbContext.SaveChanges() > 0) return true;            else return false;        }

        1)、SysComUser.Attach(Tmodel);

        将给定实体附加到集的基础上下文中,用于在上下文中重新填充数据库中已存在的实体,如果与数据库中的实体对比未有改变,则 Attach 不执行任何操作。

        2)、 dbContext.Entry<SysComUser>(Tmodel).State = EntityState.Modified;

        对象上的一个标量属性已修改,但尚未调用 SaveChanges 方法。在保存更改后,对象状态更改为 Unchanged。

    2、修改用户密码,需要从数据读取用户实体信息,将修改后的密码赋给这个实体。读取方法如下:

        ///         /// 查找登录用户信息        ///         /// 
登录名        /// 
用户信息
        public SysComUser Find(string LoginName)        {            var _user = dbContext.SysComUser.SingleOrDefault(u => u.LoginName == LoginName);            return _user;        }

     3、原始密码验证方法

        ///         /// 用户登录身份验证        ///         /// 
登录名        /// 
密码        /// 
0:登录成功;1:登录名不存在;2:密码错误
        public int Authentication(string loginName, string password)        {            var _user = dbContext.SysComUser.SingleOrDefault(u => u.LoginName == loginName);            if (_user == null) { return 1; }            if (_user.Password != password) { return 2; }            return 0;        }

     四、VIEW页面代码,自动生成后做个简单调整

@model Hillstone.Models.SysComUserPassword@{    ViewBag.Title = "修改密码";    Layout = "~/Views/Shared/_Layout.cshtml";}

修改密码

@using (Html.BeginForm()) {    @Html.AntiForgeryToken()    @Html.ValidationSummary(true)    
        
SysComUserPassword        
            @Html.LabelFor(model => model.Password)                
            @Html.EditorFor(model => model.Password)            @Html.ValidationMessageFor(model => model.Password)                
            @Html.LabelFor(model => model.NewPassword)                
            @Html.EditorFor(model => model.NewPassword)            @Html.ValidationMessageFor(model => model.NewPassword)                
            @Html.LabelFor(model => model.RNewPassword)                
            @Html.EditorFor(model => model.RNewPassword)            @Html.ValidationMessageFor(model => model.RNewPassword)                

            

@Html.ValidationMessage("Message")        

    
}
    @Html.ActionLink("Back to List", "Index")
@section Scripts {    @Scripts.Render("~/bundles/jqueryval")}