• MVC Music Store 在线音乐商店示例分析(8)CheckoutController


    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中这样可以使用事务来保证订单和订单详情的同时生成,并且不会发生有订单而没有详情的情况。所以这里我觉得有点不合理。不晓得作者是出于什么考虑的。。。

  • 相关阅读:
    JWT
    JS中try catch的用法
    React高级
    React基础
    获取当前时间前面的时间
    nodeJs
    数组里的字符串数字与数字互转
    寒假学习(二)spark学习
    寒假学习(一)Web开发人员学习路线图
    如何使用GitHub上传本地项目(idea功能强大可直接提交)
  • 原文地址:https://www.cnblogs.com/stevenhqq/p/1971505.html
Copyright © 2020-2023  润新知