四、Asp.Net MVC4.0开发CMS系统案例之密码修改模块开发

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

    <authentication mode="Forms">
      <forms loginUrl="~/SysComUser/UserLogin" timeout="2880" />
    </authentication>

修改loginUrl跳转的页面即可。

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

    一、模板的定义

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

    二、Contraller的Action编写

       /// <summary>
        /// 修改密码页面
        /// </summary>
        /// <returns></returns>
        [UserAuthorize]
        public ActionResult UserChangePassword()
        {
            return View();
        }
        /// <summary>
        /// 修改密码数据
        /// </summary>
        /// <param name="userPassword">修改密码实体数据</param>
        /// <returns>URL</returns>
        [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、修改一条用户信息

        /// <summary>
        /// 修改一条用户信息
        /// </summary>
        /// <param name="Tmodel">用户数据模型</param>
        /// <returns>布尔值</returns>
        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<SysComUser>(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、修改用户密码,需要从数据读取用户实体信息,将修改后的密码赋给这个实体。读取方法如下:

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

     3、原始密码验证方法

        /// <summary>
        /// 用户登录身份验证
        /// </summary>
        /// <param name="loginName">登录名</param>
        /// <param name="password">密码</param>
        /// <returns>0:登录成功;1:登录名不存在;2:密码错误</returns>
        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";
}
<h2>修改密码</h2>
@using (Html.BeginForm()) {
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)
    <fieldset>
        <legend>SysComUserPassword</legend>
        <div class="editor-label">
            @Html.LabelFor(model => model.Password)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Password)
            @Html.ValidationMessageFor(model => model.Password)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.NewPassword)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.NewPassword)
            @Html.ValidationMessageFor(model => model.NewPassword)
        </div>
        <div class="editor-label">
            @Html.LabelFor(model => model.RNewPassword)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.RNewPassword)
            @Html.ValidationMessageFor(model => model.RNewPassword)
        </div>
        <p>
            <input type="submit" value="Save" />@Html.ValidationMessage("Message")
        </p>
    </fieldset>
}
<div>
    @Html.ActionLink("Back to List", "Index")
</div>
@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

 

本文出自 “奔跑的小蜗牛-原创空间” 博客,请务必保留此出处http://songjiahao.blog.51cto.com/4433831/1582907

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。