MVC4制作网站教程第二章 用户密码修改2.3

一用户
1.1用户注册 
1.2用户登录 
1.3修改密码

修改密码会用到一个UserChangePassword 模型类,先添加UserChangePassword类

/// <summary>
  /// 用户修改密码模型
  /// </summary>
  [NotMapped]
  public class UserChangePassword
  {
    /// <summary>
    /// 原密码
    /// </summary>
    [Display(Name = "原密码")]
    [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 ConfirmPassword { get; set; }
  }

用到了数据库的更新,先打开UserRepository.cs 修改Update函数

/// <summary>
    /// 更新用户信息
    /// </summary>
    /// <param name="user"></param>
    /// <returns></returns>
    public override bool Update(User user)
    {
      dbContext.Users.Attach(user);
      dbContext.Entry<User>(user).State = System.Data.EntityState.Modified;
      if (dbContext.SaveChanges() > 0) return true;
      else return false;
    }

在修改密码时需要查出用户信息并更新,需要添加Find(string UserName) 函数

/// <summary>
    /// 查找用户
    /// </summary>
    /// <param name="UserName">用户名</param>
    /// <returns></returns>
    public User Find(string UserName)
    {
      return dbContext.Users.SingleOrDefault(u => u.UserName == UserName);
    }

好了打开UserController,添加ChangePassword Action

/// <summary>
    /// 修改密码
    /// </summary>
    /// <returns></returns>
    [UserAuthorize]
    public ActionResult ChangePassword()
    {
      return View();
    }
    [HttpPost]
    [UserAuthorize]
    public ActionResult ChangePassword()
    {
      return View();
    }

添加强类型(UserChangePassword)视图,在视图中添加三个文本框,修改后的视图代码

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

<div class="banner">
  <img src="~/Skins/Default/Images/banner.jpg" />
</div>

@using (Html.BeginForm())
{
  @Html.ValidationSummary(true)

  <div class="form">
    <dl>
      <dt>修改密码</dt>
      <dd>
        <div class="label">@Html.LabelFor(model => model.Password):</div>
        <div class="ctrl">@Html.PasswordFor(model => model.Password)
          @Html.ValidationMessageFor(model => model.Password)
          @Html.DisplayDescriptionFor(model => model.Password)
        </div>
      </dd>
      <dd>
        <div class="label">@Html.LabelFor(model => model.NewPassword):</div>
        <div class="ctrl">@Html.PasswordFor(model => model.NewPassword)
          @Html.ValidationMessageFor(model => model.NewPassword)
          @Html.DisplayDescriptionFor(model => model.NewPassword)
        </div>
      </dd>
      <dd>
        <div class="label">@Html.LabelFor(model => model.ConfirmPassword):</div>
        <div class="ctrl">@Html.PasswordFor(model => model.ConfirmPassword)
          @Html.ValidationMessageFor(model => model.ConfirmPassword)
          @Html.DisplayDescriptionFor(model => model.ConfirmPassword)
        </div>
      </dd>
      <dd>
        <div class="label"></div>
        <div class="ctrl">
          <input type="submit" value="修改密码" />@Html.ValidationMessage("Message")
        </div>
      </dd>
    </dl>
    <div class="clear"></div>
  </div>
}
@section Scripts {
  @Scripts.Render("~/bundles/jqueryval")
}

修改UserController中[HttpPost]方式的ChangePassword()以实现修改密码,修改完成的代码如下:

[HttpPost]
    [UserAuthorize]
    public ActionResult ChangePassword(UserChangePassword userChangePassword)
    {
      userRsy = new UserRepository();
      if (userRsy.Authentication(UserName, Common.Text.Sha256(userChangePassword.Password)) == 0)
      {
        var _user = userRsy.Find(UserName);
        if (_user == null)
        {
          Error _e = new Error { Title = "修改密码失败", Details = "修改密码时,系统查询不到用户信息", Cause = Server.UrlEncode("<li>用户在修改密码界面停留的时间过长,登录信息已失效。</li><li>系统错误。</li>"), Solution = Server.UrlEncode("<li>返回<a href='" + Url.Action("ChangePassword", "User") + "'>修改密码</a>页面,输入正确的信息后重新注册</li><li>联系网站管理员</li>") };

          return RedirectToAction("Error", "Prompt", _e);
        }
        _user.Password = Common.Text.Sha256(userChangePassword.NewPassword);
        if (userRsy.Update(_user))
        {
          Notice _n = new Notice { Title = "成功修改密码", Details = "您已经成功修改密码,请牢记您的新密码!", DwellTime = 5, NavigationName = "登陆页面", NavigationUrl = Url.Action("Login", "User") };
          return RedirectToAction("Notice", "Prompt", _n);
        }
        else
        {
          Error _e = new Error { Title = "修改密码失败", Details = "修改密码时,更新数据库失败!", Cause = Server.UrlEncode("<li>系统错误。</li>"), Solution = Server.UrlEncode("<li>返回<a href='" + Url.Action("ChangePassword", "User") + "'>修改密码</a>页面,输入正确的信息后重新注册</li><li>联系网站管理员</li>") };
          return RedirectToAction("Error", "Prompt", _e);
        }
      }
      else
      {
        ModelState.AddModelError("Password", "原密码不正确,请重新输入");
        return View();
      }

    }

在上面的代码中用到了一个UserName属性,这个是在UserController添加的属性用于返回Cookie中保存的用户名

/// <summary>
    /// 获取用户名
    /// </summary>
    public string UserName {
      get {
        HttpCookie _cookie = Request.Cookies["User"];
        if (_cookie == null) return "";
        else return _cookie["UserName"];
        }
    }

好了,浏览器中预览一下

测试一下,OK,大功告成!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

时间: 2016-08-14

ASP.NET MVC5网站开发管理列表、回复及删除(十三)

一.管理列表 跟上次我的列表相似,直接贴代码了. 首先打开Consultation控制器,添加ManageList方法 /// <summary> /// 咨询管理 /// </summary> /// <returns></returns> public ActionResult ManageList() { return View(); } 添加返回json数据的ManageJsonList public JsonResult ManageJsonLis

ASP.NET MVC5网站开发我的咨询列表及添加咨询(十二)

上次把咨询的架构搭好了,现在分两次来完成咨询:1.用户部分,2管理部分.这次实现用户部分,包含两个功能,查看我的咨询和进行咨询. 一.菜单 打开上次添加的ConsultationController控制器,添加Menu action,返回分布视图 /// <summary> /// 菜单 /// </summary> /// <returns></returns> public ActionResult Menu() { return PartialView

ASP.NET MVC5 网站开发框架模型、数据存储、业务逻辑(三)

前面项目的层次和调用关系都说明了,关系如下图 采用三层架构的时候,研究过BLL层的必要性,觉得业务逻辑完全可以在controller里实现,没有必要单独做一个项目,另一个分层多了会影响性能.后来我还是把业务逻辑独立出来,原因如下: 业务逻辑写进controller里代码看着比较混乱,时间久了代码容易理不清. 在controller里直接写逻辑重复代码会不较多,开发效率低. 分项目有利于代码重用,有时候可以直接拿到其他项目中稍作修改就可以用. 对于性能我觉得分层多了肯定会有影响,但是不会很大.现在

ASP.NET MVC5网站开发修改及删除文章(十)

上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据. 一.删除文章 由于公共模型跟,文章,附件有关联,所以这里的删除次序很重要,如果先删除模型,那么文章ModelID和附件的ModelID多会变成null,所以要先先删除文章和附件再删除公共模型. 由于公共模型和附件是一对多的关系,我们把删除公共模型和删除附件写在一起. 在BLL的BaseRepository类中有默认的De

ASP.NET MVC5网站开发用户修改资料和密码(六)

在上一篇文章网站开发(五)中实现了用户的注销和登录,其实代码里落了点东西,就是用户登录要更新最后一次登录时间和登录IP,这次补上.今天做修改资料和修改密码,TryUpdateModel是新用到的东西. 现完善昨天的登录代码: 一.用户导航菜单 这个就是侧栏的导航,以后所有控制器中action名都为Menu.目标效果如下: 先UserController添加Menu action.直接返回分布视图.右键添加视图 <div class="panel panel-primary">

ASP.NET MVC5网站开发用户注册(四)

一.默认Web项目的更改 用户这部分还是自己做,所以删除自动生成的用户相关代码. 二.添加Member区域 在web项目上点右键 添加 区域Member. 添加Home控制器,选择MVC5控制器-空 我们给public ActionResult Index()添加一个视图,代码很简单就是显示下用户名 @{ ViewBag.Title = "会员中心"; } <h2>欢迎你!@User.Identity.Name </h2> 我们先运行一下,出错啦. 这是因为项目

ASP.NET MVC5网站开发显示文章列表(九)

老习惯,先上个效果图: 1.在IBLL 在InterfaceCommonModelService接口中添加获取公共模型列表的方法 首先排序方法 /// <summary> /// 排序 /// </summary> /// <param name="entitys">数据实体集</param> /// <param name="roderCode">排序代码[默认:ID降序]</param> /

ASP.NET MVC5网站开发项目框架(二)

前几天算是开题了,关于怎么做自己想了很多,但毕竟没做过项目既不知道这些想法有无必要,也不知道能不能实现,不过邓爷爷说过"摸着石头过河"吧.这段时间看了一些博主的文章收获很大,特别是@kencery,依葫芦画瓢开写. 一.基本框架 还是先说下基本框架吧,一下子搞了7个项目看着挺乱的,我的理解是M.V.C 3者中,M是数据载体,V是用户要看的试图,C主要是协调控制与用户界面相关的操作,而数据的处理,数据库的的操作交给DAL.BLL来做.整个思路就是:View是用户看到的界面:Control

ASP.NET MVC5网站开发用户登录、注销(五)

一.创建ClaimsIdentity ClaimsIdentity(委托基于声明的标识)是在ASP.NET Identity身份认证系统的登录时要用到,我们在UserService中来生成它. 1.打开IBLL项目InterfaceUserService接口,添加接口方法ClaimsIdentity CreateIdentity(User user, string authenticationType); 2.打开BLL项目的UserService类,添加CreateIdentity方法的实现代

ASP.NET MVC5网站开发咨询管理的架构(十一)

一.总体说明 1.实现功能 2.类图 由于文章部分把大部分类都是实现了,这里仅多了一个Consultation类. 二.创建咨询模型类 在Ninesky.Models项目添加类Consultation(咨询模型),该模型跟Article类似都是CommonModel的扩展. 1.添加Consultation类. using System; using System.ComponentModel.DataAnnotations; namespace Ninesky.Models { /// <su

ASP.NET MVC5网站开发文章管理架构(七)

一.总体说明 先看一下文章管理设想要实现的功能: 再看一下类图 这里Category是栏目:CommonModel是公共模型:Article是文章:Attachment是附件: CommonModel是内容管理这块抽取出来的公共部分,像文章,咨询甚至产品都有一些共同的内容这里把它单独提取出来作为一个类.CommonModel可能包含一片文章,包含一组附件,包含一系列评论,他们之间的关系类图中已经表示出来.  二.搭建架构 这个顺序根以前一样 1.IDAL 在IDAL添加接口InterfaceCo

ASP.NET MVC5网站开发概述(一)

前段时间一直在用MVC4写个网站开发的demo,由于刚开始学所有的代码都写在一个项目中,越写越混乱,到后来有些代码自己都理不清了.正好看到别人在用MVC5写东西,喜新厌旧的我马上下载了Visual Studio 2013,幸好MVC4到MVC5变化不大,这次准备用MVC5重新写个Demo. 每次看以前写的代码总有把它丢进回收站的冲动,其实没有完美的代码,能解决问题的代码就算是好代码吧,但是我还是决定重新写一个学习的Demo,希望这次能有提高,希望这次能写完吧! 一.开发环境 1.开发环境: Vi

ASP.NET MVC5网站开发之业务逻辑层的架构和基本功能 (四)

业务逻辑层在Ninesky.Core中实现,主要功能封装一些方法通过调用数据存储层,向界面层提供服务. 一.业务逻辑层的架构 Ninesky.Core包含三个命名空间Ninesky.Core.Ninesky.Core.Types.Ninesky.Core.General. Ninesky.Core包含模型和功能实现,Ninesky.Core.Types是项目用到的一些类型的定义,Ninesky.Core.General是项目用到的一些方法的定义. 1.Ninesky.Core命名空间的结构 Ni

ASP.NET MVC5网站开发之展示层架构(五)

展示层由Ninesky.Web项目实现,负责网站内容的显示,项目包含Member和Control两个区域. Member区域实现网站内容的管理,Control区域实现网站系统管理.结构.功能图如下:  一.Member区域 1.添加Member区域 Ninesky.Web[右键]-> 添加->区域 . 在弹出的添加区域对话框输入区域名称:Member,完成区域添加. 2.添加Home控制器 Ninesky.Web->Areas->Member->Controllers[右键]

ASP.NET MVC5网站开发之总体概述(一)

由于前几次都没能写完,这次年底总算有自由时间了,又想继续捣鼓一下.于是下载了VS 2015专业版(不知为什么我特别钟爱专业版,而不喜欢企业版).由于以前的教训,我这次决定写一个极简的Deom,简到什么程度呢?简单到只实现添加.修改栏目,用户登录后可以添加管理文章.管理员登陆后可以修改网站设置(也就标题.版权信息等)这些功能.为了避免以前大家经常搞不清哪个是最新的代码的情况,这次我准备把代码直接发布到Codeplex.com上做个代码开源,到时候大家直接去Codeplex.com下载最新代码就行了