ASP.NET MVC 音乐商店 - 9. 注册和结账
在这一节,我们将创建结账的控制器 CheckoutController 来收集用户的地址和付款信息,我们需要用户在结账前注册账户,因为这个控制器需要授权。
当用户点击结账 Checkout 按钮的时候,用户将会被导航到结账的处理流程中。
如果用户没有登录,将会被提示需要登录。
一旦用户成功登陆,用户就可以看到地址和付款的视图。
一旦用户填写了这个表单并提交,他们将会看到订单的确认页面。
视图访问不存在的订单,或者不属于你的订单,将会看到错误页面。
合并购物车
在匿名购物的时候,当用户点击结账Checkout 按钮,用户会被要求注册和登陆,用户会希望继续使用原来的购物车,所以,在匿名用户登录之后,我们需要维护购物车。
实际上非常简单,因为ShoppingCart 类已经提供了一个方法,通过当前的用户名来获取购物车中所有的项目,在用户注册登录以后,我们只需要调用这个方法。
打开在成员管理和授权中添加的AccountController 类,增加一个using 来引用MvcMusicStore.Models,然后,增加MigrateShoppingCart 方法。
private void MigrateShoppingCart(string UserName)
{
// Associate shopping cart items with logged-in user
var cart = ShoppingCart.GetCart(this.HttpContext);
cart.MigrateCart(UserName);
Session[ShoppingCart.CartSessionKey] = UserName;
}
然后,修改LonOn 的Post 处理方法,在用户通过验证之后,调用MigrateShoppingCart 方法。
//
// POST: /Account/LogOn
[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
MigrateShoppingCart(model.UserName);
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
在Register 的Post 处理方法中,一旦用户成功创建帐户,也进行类似的修改,
//
// POST: /Account/Register
[HttpPost]
public ActionResult Register(RegisterModel model)
{
if (ModelState.IsValid)
{
// Attempt to register the user
MembershipCreateStatus createStatus;
Membership.CreateUser(model.UserName, model.Password, model.Email, "question", "answer", true, null, out createStatus);
if (createStatus == MembershipCreateStatus.Success)
{
 
补充:Web开发 , ASP.Net ,