四、Asp.Net MVC4.0开发CMS系统案例之密码修改模块开发
首先针对上一次的密码登录做一个补充说明,我们知道在控制器方法汇总使用过滤器[UserAuthorize]做为登录验证非常方便,验证是否成功,然后进行页面跳转,如果验证不成功我要给他们设定一个跳转页面,我们需要在config中做如下配置:
<authenticationmode="Forms"><formsloginUrl="~/SysComUser/UserLogin"timeout="2880"/></authentication>
修改loginUrl跳转的页面即可。
用户登录密码修改步骤如下:
一、模板的定义
///<summary>///修改密码///</summary>[NotMapped]publicclassSysComUserPassword{///<summary>///原密码///</summary>[Display(Name="原密码",Description="6-20字符")][Required(ErrorMessage="×")][StringLength(20,MinimumLength=6,ErrorMessage="×")][DataType(DataType.Password)]publicstringPassword{get;set;}///<summary>///新密码///</summary>[Display(Name="新密码",Description="6-20字符")][Required(ErrorMessage="×")][StringLength(20,MinimumLength=6,ErrorMessage="×")][DataType(DataType.Password)]publicstringNewPassword{get;set;}///<summary>///确认密码///</summary>[Display(Name="确认密码",Description="再次输入密码")][Compare("NewPassword",ErrorMessage="×")][DataType(DataType.Password)]publicstringRNewPassword{get;set;}}
二、Contraller的Action编写
///<summary>///修改密码页面///</summary>///<returns></returns>[UserAuthorize]publicActionResultUserChangePassword(){returnView();}///<summary>///修改密码数据///</summary>///<paramname="userPassword">修改密码实体数据</param>///<returns>URL</returns>[HttpPost][UserAuthorize]//Extensionsh中对UserAuthorizeAttribute扩展重写AuthorizeCore():表示这是一个只处理那些通过身份验证的URL请求,如果没有通过身份验证就请求这个Action会被带到登录页面。publicActionResultUserChangePassword(SysComUserPassworduserPassword){int_rnum=userRpy.Authentication(LoginName,userPassword.Password);if(_rnum==0){//读取用户信息var_user=userRpy.Find(LoginName);if(_user==null){ModelState.AddModelError("Message","该用户已经失效,请重新登录!");returnView();}else{_user.Password=userPassword.NewPassword;if(userRpy.Update(_user)){ModelState.AddModelError("Message","修改成功!");returnView();}else{ModelState.AddModelError("Message","更新数据库失败!");returnView();}}}else{ModelState.AddModelError("Message","原密码不正确,请重新输入!");returnView();}}publicstringLoginName{get{HttpCookie_cookie=HttpContext.Request.Cookies["user"];if(_cookie==null)return"";elsereturn_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、修改一条用户信息
///<summary>///修改一条用户信息///</summary>///<paramname="Tmodel">用户数据模型</param>///<returns>布尔值</returns>publicoverrideboolUpdate(SysComUserTmodel){//if(Tmodel==null){returnfalse;}//var_tmodel=HillstoneContext.SysComUser.FirstOrDefault(u=>u.UserId==Tmodel.UserId);//if(_tmodel==null){returnfalse;}//_tmodel=Tmodel;//if(HillstoneContext.SaveChanges()>0)dbContext.SysComUser.Attach(Tmodel);dbContext.Entry<SysComUser>(Tmodel).State=EntityState.Modified;if(dbContext.SaveChanges()>0)returntrue;elsereturnfalse;}
1)、SysComUser.Attach(Tmodel);
将给定实体附加到集的基础上下文中,用于在上下文中重新填充数据库中已存在的实体,如果与数据库中的实体对比未有改变,则 Attach 不执行任何操作。
2)、dbContext.Entry<SysComUser>(Tmodel).State = EntityState.Modified;
对象上的一个标量属性已修改,但尚未调用 SaveChanges 方法。在保存更改后,对象状态更改为 Unchanged。
2、修改用户密码,需要从数据读取用户实体信息,将修改后的密码赋给这个实体。读取方法如下:
///<summary>///查找登录用户信息///</summary>///<paramname="LoginName">登录名</param>///<returns>用户信息</returns>publicSysComUserFind(stringLoginName){var_user=dbContext.SysComUser.SingleOrDefault(u=>u.LoginName==LoginName);return_user;}
3、原始密码验证方法
///<summary>///用户登录身份验证///</summary>///<paramname="loginName">登录名</param>///<paramname="password">密码</param>///<returns>0:登录成功;1:登录名不存在;2:密码错误</returns>publicintAuthentication(stringloginName,stringpassword){var_user=dbContext.SysComUser.SingleOrDefault(u=>u.LoginName==loginName);if(_user==null){return1;}if(_user.Password!=password){return2;}return0;}
四、VIEW页面代码,自动生成后做个简单调整
@modelHillstone.Models.SysComUserPassword@{ViewBag.Title="修改密码";Layout="~/Views/Shared/_Layout.cshtml";}<h3>修改密码</h3>@using(Html.BeginForm()){@Html.AntiForgeryToken()@Html.ValidationSummary(true)<fieldset><legend>SysComUserPassword</legend><divclass="editor-label">@Html.LabelFor(model=>model.Password)</div><divclass="editor-field">@Html.EditorFor(model=>model.Password)@Html.ValidationMessageFor(model=>model.Password)</div><divclass="editor-label">@Html.LabelFor(model=>model.NewPassword)</div><divclass="editor-field">@Html.EditorFor(model=>model.NewPassword)@Html.ValidationMessageFor(model=>model.NewPassword)</div><divclass="editor-label">@Html.LabelFor(model=>model.RNewPassword)</div><divclass="editor-field">@Html.EditorFor(model=>model.RNewPassword)@Html.ValidationMessageFor(model=>model.RNewPassword)</div><p><inputtype="submit"value="Save"/>@Html.ValidationMessage("Message")</p></fieldset>}<div>@Html.ActionLink("BacktoList","Index")</div>@sectionScripts{@Scripts.Render("~/bundles/jqueryval")}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。