在这一节,我们将创建结账的控制器 CheckoutController
来收集用户的地址和付款信息,我们需要用户在结账前注册账户,因为这个控制器需要授权。
当用户点击结账 Checkout 按钮的时候,用户将会被导航到结账的处理流程中。

如果用户没有登录,将会被提示需要登录。
一旦用户成功登陆,用户就可以看到地址和付款的视图。
一旦用户填写了这个表单并提交,他们将会看到订单的确认页面。
视图访问不存在的订单,或者不属于你的订单,将会看到错误页面。
在匿名购物的时候,当用户点击结账 Checkout
按钮,用户会被要求注册和登陆,用户会希望继续使用原来的购物车,所以,在匿名用户登录之后,我们需要维护购物车。
实际上非常简单,因为 ShoppingCart
类已经提供了一个方法,通过当前的用户名来获取购物车中所有的项目,在用户注册登录以后,我们只需要调用这个方法。
打开在成员管理和授权中添加的 AccountController 类,增加一个 using 来引用 MvcMusicStore.Models,然后,增加
MigrateShoppingCart 方法。
然后,修改 LonOn 的 Post 处理方法,在用户通过验证之后,调用 MigrateShoppingCart 方法。
在 Register 的 Post 处理方法中,一旦用户成功创建帐户,也进行类似的修改,
就这样,现在匿名用户登录之后,购物车将会被自动传送过来。
在 Controller 文件夹上右键,添加一个新的控制器,命名为 CheckoutController ,使用空的控制器模板。
首先,在控制器上增加授权的标注 [Authorize],来确定用户必须在登录之后才能访问。
注意:这一步很像我们前面在 StoreManager 控制器上的工作,但是,在那个时候,我们要求用户必须拥有 Administrator
的角色。在结账控制器中,我们不需要用户必须是 Administrator ,而是必须登录。
出于简化的考虑,在这个教程中没有处理付款的信息,作为替代,我们允许用户输入一个促销代码,这里促销代码定义在常量 PromoCode。
像在 StoreController 中一样,在控制器中,我们也需要定义 MusicStoreEntities 的字段,将它命名为
storeDB,结账的开始部分如下。
结账的控制器将包含下面的控制器方法:
AddressAndPayment ( Get ) 用来显示一个用户输入信息的表单
AddressAndPayment ( Post ) 验证用户的输入,处理订单。
Complete 用来在在用户完成订单之后显示,这个视图包含用户的订单账号和确认信息。
首先,将 Index 方法改名为 AddressAndPayment, 这个 Action 方法用来显示结账表单,所以,不需要任何的模型信息。
AddressAndPayment 的 Post 处理方法使用我们在 StoreManagerController
中类似的模式:如果成功了就完成订单,如果失败了就重新显示表单。
在验证了表单之后,我们将会直接检查促销代码,假设所有的信息都是正确的,我们将会在订单中保存信息,告诉购物车对象完成订单处理,最后,重定向到完成的
Complete Action 方法。
一旦完成了结账处理,用户将被重定向到 Complete 方法, 这个 Action
方法将会进行简单的检查,在显示订单号之前,检查订单是否属于当前登录的用户。
注意,错误视图创建项目的时候,保存在 /Views/Shared 文件夹中的 error.cshtml 生成。
完整的 CheckoutController 如下所示.
现在,我们创建 AddressAndPayment 视图,在 AddressAndPayment 控制器的某个 Action 中点击鼠标的右键,增加名为
AddressAndPayment 的强类型 Order 视图,使用编辑模板。
这个视图使用我们在 StoreManager 的 Edit 视图中使用的两个技术:
1.使用 Html.EditorForModel() 来显示订单模型的字段
2.使用 Order 模型的验证标签定义验证规则
我们先使用 Html.EditorForModel() 方法,然后,增加额外的输入框用来输入促销码,完成的视图如下。
现在,我们的视图已经创建了,类似于专辑,我们定义订单的验证规则。在 Models 文件夹上点击鼠标的右键,增加名为 Order
的模型类,我们使用专辑中使用过的验证标注,我们还将使用正则表达式来验证用户的电子邮件地址。
在没有提交必要的信息或者提交错误信息的时候,我们将会看到客户端的验证信息。
现在,我们已经完成了结账中最困难的部分,还有一些小的工作要完成。我们增加两个简单的视图,还需要注意在登录过程中购物车信息。
完成结账的视图非常简单,仅仅需要显示订单的编号,在控制器中的 Complete 方法上点击右键,增加名为 Complete 的强类型 int
视图。
现在,修改视图显示订单的编号。
项目的默认模板中,包含了定义在 /Shared Views
文件夹中的错误页面,可以在整个站点中使用。这个页面仅仅包含简单的信息,也没有使用我们的布局,我们更新一下。
由于这是通用的错误页面,内容非常简单,我们仅仅包含一个提示信息,和用来重做工作的导航到上一个页面的链接。