您好,登錄后才能下訂單哦!
首先針對上一次的密碼登錄做一個補充說明,我們知道在控制器方法匯總使用過濾器[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"; } <h3>修改密碼</h3> @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") }
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。