四、Asp.NetMVC4.0开发CMS系统案例之密码修改模块开发-创新互联
首先针对上一次的密码登录做一个补充说明,我们知道在控制器方法汇总使用过滤器[UserAuthorize]做为登录验证非常方便,验证是否成功,然后进行页面跳转,如果验证不成功我要给他们设定一个跳转页面,我们需要在config中做如下配置:
成都创新互联长期为上千客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为沙坡头企业提供专业的成都做网站、网站制作,沙坡头网站改版等技术服务。拥有十载丰富建站经验和众多成功案例,为您定制开发。修改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
对象上的一个标量属性已修改,但尚未调用 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)
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
名称栏目:四、Asp.NetMVC4.0开发CMS系统案例之密码修改模块开发-创新互联
浏览地址:http://scyanting.com/article/ceoogs.html