zoukankan      html  css  js  c++  java
  • MVC Music Store 在线音乐商店示例分析(7)AccountController

       之前看到的都是Models,它是MVC中非常重要的一个部分。所有的数据都是通过Models来承载和交互。当然Models使用了Entity Framework V4.0, Entity Framework V4.0版本也较之前的版本有所变化,解决了几个麻烦的问题,这个在后面的代码中可以遇到.还有两个Model还没有分析到,分别是ShoppingCartRemoverViewModel和ShoppingCartViewModel两个模型,他们是用于购物车界面呈现复杂数据的时候用到的,在后面遇到的时候再说。

        下面来看看MVC中非常重要的一个部分—Controller 控制器部分。首先来看AccountController 用户账户控制器。整个站点使用成员管理服务,所以账户处理这一块我们就不要多操心了,这也是在数据库分析的时候没有看见账户管理这一块内容的原因了。

    注释后的源代码如下:

    1 /// <summary>
    2 /// 账户管理控制器
    3 /// </summary>
    4   public class AccountController : Controller
    5 {
    6
    7 /// <summary>
    8 /// 表单验证服务接口
    9 /// </summary>
    10   public IFormsAuthenticationService FormsService { get; set; }
    11 /// <summary>
    12 /// 成员管理服务接口
    13 /// </summary>
    14   public IMembershipService MembershipService { get; set; }
    15
    16 /// <summary>
    17 /// 重载初始化控制器
    18 /// 用于创建表单验证服务、成员管理服务实例
    19 /// </summary>
    20 /// <param name="requestContext"></param>
    21   protected override void Initialize(RequestContext requestContext)
    22 {
    23 if (FormsService == null) { FormsService = new FormsAuthenticationService(); }
    24 if (MembershipService == null) { MembershipService = new AccountMembershipService(); }
    25
    26 base.Initialize(requestContext);
    27 }
    28
    29 /// <summary>
    30 /// 迁移购物车
    31 /// 私有方法,提供登录的时候迁移账户的购物车
    32 /// </summary>
    33 /// <param name="UserName">用户名</param>
    34 private void MigrateShoppingCart(string UserName)
    35 {
    36 // Associate shopping cart items with logged-in user
    37 // 给登录用户关联购物车项
    38 var cart = ShoppingCart.GetCart(this.HttpContext);
    39
    40 cart.MigrateCart(UserName);
    41 Session[ShoppingCart.CartSessionKey] = UserName;
    42 }
    43
    44 // **************************************
    45 // URL: /Account/LogOn
    46 // 登录 返回空视图
    47 // **************************************
    48
    49 public ActionResult LogOn()
    50 {
    51 return View();
    52 }
    53
    54 /// <summary>
    55 /// 登录
    56 /// 用于表单提交登录信息[Post]
    57 /// </summary>
    58 /// <param name="model">登录模型</param>
    59 /// <param name="returnUrl">登录后返回之前的请求地址</param>
    60 /// <returns></returns>
    61 [HttpPost]
    62 public ActionResult LogOn(LogOnModel model, string returnUrl)
    63 {
    64 //如果模型通过验证
    65 if (ModelState.IsValid)
    66 {
    67 //如果成员管理验证用户通过
    68 if (MembershipService.ValidateUser(model.UserName, model.Password))
    69 {
    70 //迁移购物车
    71 MigrateShoppingCart(model.UserName);
    72 //表单服务设置该用户登录
    73 FormsService.SignIn(model.UserName, model.RememberMe);
    74 //如果请求之前的地址是否是本地地址
    75 if (Url.IsLocalUrl(returnUrl))
    76 {
    77 //重定向到之前请求的地址
    78 return Redirect(returnUrl);
    79 }
    80 else
    81 {
    82 //否则重定向到首页
    83 return RedirectToAction("Index", "Home");
    84 }
    85 }
    86 else
    87 {
    88 //模型验证不通过,添加模型错误消息。
    89 ModelState.AddModelError("", "The user name or password provided is incorrect.");
    90 }
    91 }
    92
    93 // If we got this far, something failed, redisplay form
    94 // 如果代码运行到这里,说明填写的表单有问题,那么重新显示表单,以便用户充填
    95 return View(model);
    96 }
    97
    98 // **************************************
    99 // URL: /Account/LogOff
    100 // 注销
    101 // **************************************
    102 /// <summary>
    103 /// 注销
    104 /// </summary>
    105 /// <returns></returns>
    106 public ActionResult LogOff()
    107 {
    108 // 表单服务注销当前账户
    109 FormsService.SignOut();
    110 // 重定向到首页
    111 return RedirectToAction("Index", "Home");
    112 }
    113
    114 // **************************************
    115 // URL: /Account/Register
    116 // 注册
    117 // **************************************
    118
    119 public ActionResult Register()
    120 {
    121 //设置密码长度,该PasswordLength属性是.NET 4.0的新特性(在运行时解析)
    122 //以前需要先声明该属性,之后才能使用。
    123 ViewBag.PasswordLength = MembershipService.MinPasswordLength;
    124 return View();
    125 }
    126
    127 /// <summary>
    128 /// 注册
    129 /// 用于接收提交注册的表单[POST]
    130 /// </summary>
    131 /// <param name="model">注册模型</param>
    132 /// <returns></returns>
    133 [HttpPost]
    134 public ActionResult Register(RegisterModel model)
    135 {
    136 //如果该模型通过验证
    137 if (ModelState.IsValid)
    138 {
    139 // Attempt to register the user
    140 // 通过成员管理服务接口尝试注册用户
    141 MembershipCreateStatus createStatus = MembershipService.CreateUser(model.UserName, model.Password, model.Email);
    142
    143 // 如果注册状态为成功
    144 if (createStatus == MembershipCreateStatus.Success)
    145 {
    146 // 迁移该用户的购物车
    147 MigrateShoppingCart(model.UserName);
    148 //使用表单服务登录该用户
    149 FormsService.SignIn(model.UserName, false /* createPersistentCookie 是否创建持久性Cookie */);
    150 //重定向到首页
    151 return RedirectToAction("Index", "Home");
    152 }
    153 else
    154 {
    155 //如果注册失败,则将注册的错误消息添加到模型消息中。
    156 ModelState.AddModelError("", AccountValidation.ErrorCodeToString(createStatus));
    157 }
    158 }
    159
    160 // If we got this far, something failed, redisplay form
    161 // 如果代码运行到这里,则肯定发生了错误,重新显示注册表单。
    162 ViewBag.PasswordLength = MembershipService.MinPasswordLength;
    163 return View(model);
    164 }
    165
    166 // **************************************
    167 // URL: /Account/ChangePassword
    168 // 账户修改密码
    169 // **************************************
    170
    171 /// <summary>
    172 /// 修改密码
    173 /// 此处使用了特性标记Authorize用来判断用户是否登录
    174 /// </summary>
    175 /// <returns></returns>
    176 [Authorize]
    177 public ActionResult ChangePassword()
    178 {
    179 ViewBag.PasswordLength = MembershipService.MinPasswordLength;
    180 return View();
    181 }
    182
    183 /// <summary>
    184 /// 修改密码
    185 /// 用于接收授权用户提交的修改密码表单
    186 /// </summary>
    187 /// <param name="model"></param>
    188 /// <returns></returns>
    189 [Authorize]
    190 [HttpPost]
    191 public ActionResult ChangePassword(ChangePasswordModel model)
    192 {
    193 //如果模型通过验证
    194 if (ModelState.IsValid)
    195 {
    196 //如果成员管理服务修改密码成功
    197 if (MembershipService.ChangePassword(User.Identity.Name, model.OldPassword, model.NewPassword))
    198 {
    199 //重定向到当前控制器下的changePasswordSucess Action。
    200 return RedirectToAction("ChangePasswordSuccess");
    201 }
    202 else
    203 {
    204 //否则将错误消息添加到模型中
    205 ModelState.AddModelError("", "The current password is incorrect or the new password is invalid.");
    206 }
    207 }
    208
    209 // If we got this far, something failed, redisplay form
    210 // 如果代码运行到这里,则说明有错误,重新显示表单,以便用户再次修改密码
    211 ViewBag.PasswordLength = MembershipService.MinPasswordLength;
    212 return View(model);
    213 }
    214
    215 // **************************************
    216 // URL: /Account/ChangePasswordSuccess
    217 // 修改密码成功
    218 // **************************************
    219
    220 public ActionResult ChangePasswordSuccess()
    221 {
    222 return View();
    223 }
    224
    225 }

    AccountController中包含有IFormsAuthenticationService服务接口、ImembershipService服务接口。分别用作于表单验证和成员管理。并且重写了Initiallize方法来初始化这两个成员。

    MigrateShoppingCart这个方法用迁移购物车,当用户登录的时候,将登录前的购物车内容给他迁移到登录后的账户下面,以便之后下订单。

    登录、注销、注册、修改密码这些都是账户管理控制器最基本的方法。但是此处我觉得少了个东西Action,没有权限分配的Action,将来我怎么来设置管理员???

  • 相关阅读:
    js点击按钮触发事件的方法(含函数的写法)
    操作文件
    克隆别人的仓库,提交到自己的远程仓库的方法
    时间戳变成 标准时间展示的方法
    还没看的书
    print 和 println的区别
    初学java记录
    java 的一个hellow word 代码解释
    eclipse 创建一个java项目 运行
    Eclipse环境配置
  • 原文地址:https://www.cnblogs.com/stevenhqq/p/1971445.html
Copyright © 2011-2022 走看看