9.3.14  注册和结账

9.3.14 注册和结账

在这一节,将创建结账的控制器CheckoutController来收集用户的地址和付款信息,需要用户在结账前注册账户,因为这个控制器需要授权。如图9-62所示,当用户单击结账Checkout按钮的时候,用户将会被导航到结账的处理流程中。如果用户没有登录,将会被提示需要登录,如图9-64所示。

978-7-111-46863-9-Chapter09-147.jpg

图9-62 Details视图中添加某商品到购物车

978-7-111-46863-9-Chapter09-148.jpg

图9-63 购物车

978-7-111-46863-9-Chapter09-149.jpg

图9-64 用户登录界面

一旦用户成功登录,用户就可以看到地址和付款的视图,如图9-65所示。

978-7-111-46863-9-Chapter09-150.jpg

图9-65 用户地址和付款

一旦用户填写了这个表单并提交,他们将会看到订单的确认页面,如图9-66所示。

978-7-111-46863-9-Chapter09-151.jpg

图9-66 下单完成

1.合并购物车

在匿名购物的时候,当用户单击结账Checkout按钮,用户会被要求注册和登录,用户会希望继续使用原来的购物车,所以,在匿名用户登录之后,需要维护购物车。实际上非常简单,因为ShoppingCart类已经提供了一个方法,通过当前的用户名来获取购物车中所有的项目,在用户注册登录以后,只需要调用这个方法。

打开在成员管理和授权中添加的AccountController类,增加一个using来引用MvcMusic-Store.Models,然后,增加MigrateShoppingCart方法。代码如下:

978-7-111-46863-9-Chapter09-152.jpg

然后,修改LonOn的Post处理方法,在用户通过验证之后,调用MigrateShoppingCart方法。代码如下:

978-7-111-46863-9-Chapter09-153.jpg

在Register的Post处理方法中,一旦用户成功创建账户,也进行类似的修改。代码如下:

978-7-111-46863-9-Chapter09-154.jpg

2.创建结账CheckoutController控制器

在Controller文件夹上右键,添加一个新的控制器,命名为CheckoutController,使用空的控制器模板,如图9-67所示。

978-7-111-46863-9-Chapter09-155.jpg

图9-67 添加checkout控制器

首先,在控制器上增加授权的标注[Authorize],来确定用户必须在登录之后才能访问。代码如下:

978-7-111-46863-9-Chapter09-156.jpg

注意:这一步很像前面在StoreManager控制器上的工作,但是,在那个时候,要求用户必须拥有Administrator的角色。在结账控制器中,不需要用户必须是Administrator,而是必须登录。

出于简化的考虑,在这个教程中没有处理付款的信息,作为替代,允许用户输入一个促销代码,这里促销代码定义在常量PromoCode。

像在StoreController中一样,在控制器中,也需要定义MusicStoreEntities的字段,将它命名为storeDB,结账的开始部分代码如下:

978-7-111-46863-9-Chapter09-157.jpg

结账的控制器将包含下面的控制器方法:

AddressAndPayment(Get)用来显示一个用户输入信息的表单

AddressAndPayment(Post)验证用户的输入,处理订单。

Complete()用来在用户完成订单之后显示用户的订单账号和确认信息。

首先,将Index方法改名为AddressAndPayment,这个Action方法用来显示结账表单,所以,不需要任何的模型信息,代码如下:

978-7-111-46863-9-Chapter09-158.jpg

AddressAndPayment的Post处理方法使用在StoreManagerController中类似的模式:如果成功了就完成订单,如果失败了就重新显示表单。在验证了表单之后,将会直接检查促销代码,假设所有的信息都是正确的,将会在订单中保存信息,告诉购物车对象完成订单处理,最后,重定向到完成的Complete Action方法,代码如下:

978-7-111-46863-9-Chapter09-159.jpg

978-7-111-46863-9-Chapter09-160.jpg

一旦完成了结账处理,用户将被重定向到Complete方法,这个Action方法将会进行简单的检查,在显示订单号之前,检查订单是否属于当前登录的用户。代码如下:

978-7-111-46863-9-Chapter09-161.jpg

978-7-111-46863-9-Chapter09-162.jpg

3.增加AddressAndPayment视图

现在,创建AddressAndPayment视图,在AddressAndPayment控制器的某个Action中单击鼠标的右键,增加名为AddressAndPayment的强类型Order视图,使用编辑模板,如图9-68所示。

978-7-111-46863-9-Chapter09-163.jpg

图9-68 添加AddressAndPayment视图

打开addressandpayment.cshtml文件,先使用Html.EditorForModel()方法允许用户自定义视图,然后,增加额外的输入框用来输入促销码,代码如下:

978-7-111-46863-9-Chapter09-164.jpg

978-7-111-46863-9-Chapter09-165.jpg

4.增加完成结账视图

完成结账的视图非常简单,仅仅需要显示订单的编号,在控制器中的Complete方法上单击右键,增加名为Complete的强类型int视图,如图9-69所示。

978-7-111-46863-9-Chapter09-166.jpg

图9-69 添加Complete视图

打开,修改视图显示订单的编号。代码如下:

978-7-111-46863-9-Chapter09-167.jpg

5.更新错误视图

项目的默认模板中,包含了定义在/Shared Views文件夹中的错误页面,可以在整个站点中使用。这个页面仅仅包含简单的信息,也没有使用自己的布局,应更新一下。

由于这是通用的错误页面,内容非常简单,仅仅包含一个提示信息和用来重做工作的导航到上一个页面的链接。代码如下:

978-7-111-46863-9-Chapter09-168.jpg