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,将来我怎么来设置管理员???

原文地址:https://www.cnblogs.com/stevenhqq/p/1971445.html