CheckoutController结账控制器。
注释后的源代码如下:
1 /// <summary>
2 /// 结账控制器
3 /// Authorize特性标记说明该控制器必须要授权才能访问
4 /// </summary>
5 [Authorize]
6 public class CheckoutController : Controller
7 {
8 /// <summary>
9 /// 音乐商店实体
10 /// </summary>
11 MusicStoreEntities storeDB = new MusicStoreEntities();
12 /// <summary>
13 /// 推广代码
14 /// </summary>
15 const string PromoCode = "FREE";
16
17 //
18 // GET: /Checkout/AddressAndPayment
19 //
20 public ActionResult AddressAndPayment()
21 {
22 //这里有点奇怪,在MVC1、MVC2中都要填写模型,否则页面中如何生成对应的表单呢??
23 return View();
24 }
25
26 //
27 // POST: /Checkout/AddressAndPayment
28 [HttpPost]
29 public ActionResult AddressAndPayment(FormCollection values)
30 {
31 var order = new Order();
32
33 try
34 {
35 // Updat the model
36 // 将表单中的数据装载到订单模型中
37 UpdateModel(order);
38
39 if (string.Equals(values["PromoCode"],
40 PromoCode,
41 StringComparison.OrdinalIgnoreCase) == false)
42 {
43 //如果填入的推广代码不相同,返回加载该模型数据后的页面,要求用户充填推广代码
44 return View(order);
45 }
46 else
47 {
48 //如果模型状态通过验证
49 if (ModelState.IsValid)
50 {
51 // Promo Code supplied
52
53 //设置订单用户名和创建日期
54 order.Username = User.Identity.Name;
55 order.OrderDate = DateTime.Now;
56
57 // Save Order 保存订单到数据库
58 storeDB.Orders.Add(order);
59 storeDB.SaveChanges();
60
61 // Process the order 通过购物车来处理订单详情
62 var cart = ShoppingCart.GetCart(this);
63 cart.CreateOrder(order);
64
65 //重定向到订单完成页面
66 return RedirectToAction("Complete", new { id = order.OrderId });
67 }
68 else
69 {
70 //模型通不过验证则抛出异常
71 throw new Exception("Model State is not valid!");
72 }
73 }
74 }
75 catch
76 {
77 // Invalid -- redisplay with errors
78 // 发生异常则充填订单。
79 return View(order);
80 }
81 }
82
83 //
84 // GET: /Checkout/Complete
85 /// <summary>
86 /// 完成结账
87 /// </summary>
88 /// <param name="id">订单编号</param>
89 /// <returns></returns>
90 public ActionResult Complete(int id)
91 {
92 // Validate that the customer owns this order
93 // 确认该订单是否属于当前用户
94 bool isValid = storeDB.Orders.Any(
95 o => o.OrderId == id && o.Username == User.Identity.Name);
96
97 if (isValid)
98 {
99 //如果是则返回成功订单的编号
100 return View(id);
101 }
102 else
103 {
104 //否则返回错误消息。
105 return View("Error");
106 }
107 }
108 }
该控制器类的上面有个特性标记Authorize标明该控制器中的每个Action必须是经过授权才能访问的。
PromoCode字段用于界面订购商品的时候的推广代码验证(免费/优惠活动之类的一个效验)。
Action AddressAndPayment(填写订单地址和结账)用于Get请求的方法只是返回了一个空View,这里有点奇怪,没有模型来填充,那界面如何知道怎么生成对应的表单呢?(MVC1、MVC2中可以通过填入Model来return View可以生成对应Post提交表单时的表单页面。)
Complete Action完成结账,当AddressAndPayment Action顺利完成的时候在数据库中会生出对应的订单,但是还没有生成好对应订单详细,通过这个Complete Action就是完成生成对应的订单详细的操作。此处我觉得有点啰嗦,不如将Complete Action中的代码直接编写到AddressAdnPayment Action中这样可以使用事务来保证订单和订单详情的同时生成,并且不会发生有订单而没有详情的情况。所以这里我觉得有点不合理。不晓得作者是出于什么考虑的。。。