SportsStore是《精通ASP.NET MVC3框架(第三版)》中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器、URL优化、导航、分页、购物车、订单、产品管理、图像上传......是不错的MVC实践项目,但该项目不是放在多层框架下开发的,离真实项目还有一段距离。本系列将尝试在多层框架下实现SportsStore项目,并用自己的方式实现一些功能。

本篇为系列第七篇,包括:

■ 9、实现订单提交

9、实现订单提交

首先在购物车显示页面Cart/Index.cshtml中,添加结账按钮:

@model MySportsStore.WebUI.Models.CartIndexViewModel

@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
} <table width="50%" align="left">
<thead>
<tr>
<th align="left">产品名称</th>
<th align="center">数量</th>
<th align="right">单价</th>
<th align="right">小计</th>
<th></th>
</tr>
</thead>
<tbody>
@foreach (var line in Model.Cart.Lines)
{
<tr>
<td align="left">@line.Product.Name</td>
<td align="center">@line.Quantity</td>
<td align="right">@line.Product.Price.ToString("c")</td>
<td align="right">@((line.Quantity * line.Product.Price).ToString("c"))</td>
<td>
@using (Html.BeginForm("RemoveFromCart", "Cart"))
{
@Html.Hidden("Id", line.Product.Id)
@Html.HiddenFor(x => x.ReturnUrl)
<input class="actionButtons" type="submit" value="移除"/>
}
</td>
</tr>
}
</tbody>
<tfoot>
<tr>
<td colspan="3" align="right">总计:</td>
<td align="right">@Model.Cart.ComputeTotalValue().ToString("c")</td>
</tr>
</tfoot>
</table>
<p align="left" class="actionButtons" style="width: 100%;clear: both">
<a href="@Model.ReturnUrl">继续购物</a>
@Html.ActionLink("结账","CheckOut")
</p>

点击结账,跳转到一个视图页面,填写必要的联系方式等信息,其对应的模型为:

using System.ComponentModel.DataAnnotations;

namespace MySportsStore.Model
{
public class ShippingDetail
{
[Required(ErrorMessage = "必填")]
[Display(Name = "姓名")]
public string Name { get; set; } [Required(ErrorMessage = "必填")]
[Display(Name = "地址")]
public string Line { get; set; }
}
}

订单提交页Cart/CheckOUt.cshtml:

@model MySportsStore.Model.ShippingDetail

@{
ViewBag.Title = "CheckOut";
Layout = "~/Views/Shared/_Layout.cshtml";
} <h2>填写地址等信息</h2> @using (Html.BeginForm())
{
@Html.LabelFor(m => m.Name)
@Html.EditorFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)
<br/><br/>
@Html.LabelFor(m => m.Line)
@Html.EditorFor(m => m.Line)
@Html.ValidationMessageFor(m => m.Line) <p align="center">
<input class="actionButtons" type="submit" value="提交订单"/>
</p>
}

运行:

在为Cart控制器添加处理订单的方法之前,我们首先定义一个处理订单的接口:

using MySportsStore.Model;
using MySportsStore.WebUI.Models; namespace MySportsStore.WebUI.Abstract
{
public interface IOrderProcessor
{
void ProcessOrder(Cart cart, ShippingDetail shippingDetail); }
}

假设,我们希望在接到订单时发邮件给管理员,创建一个实现IOrderProcessor的类:

using System.Net;
using System.Net.Mail;
using System.Text;
using MySportsStore.WebUI.Abstract; namespace MySportsStore.WebUI.Concrete
{
public class EmailOrderProcessor : IOrderProcessor
{
public void ProcessOrder(Models.Cart cart, Model.ShippingDetail shippingDetail)
{
MailMessage mailMsg = new MailMessage();
mailMsg.From = new MailAddress("qdjjx9441@sina.com");
mailMsg.To.Add(new MailAddress("764190362@qq.com"));
mailMsg.Subject = "新订单"; //邮件内容主体
StringBuilder body = new StringBuilder();
body.AppendLine("接收到一个新订单:");
body.AppendLine("<br />");
body.AppendLine("订购商品包括:");
body.AppendLine("<br />");
foreach (var line in cart.Lines)
{
var subTotal = line.Product.Price * line.Quantity;
body.AppendFormat("{0}*{1}(小计:{2:c})", line.Quantity, line.Product.Name, subTotal);
body.AppendLine("<br />");
}
body.AppendFormat("总计:{0:c}", cart.ComputeTotalValue());
body.AppendLine("<br />");
body.AppendLine("收货人信息:");
body.AppendLine(shippingDetail.Name);
body.AppendLine(shippingDetail.Line);
body.AppendLine("<br />"); mailMsg.Body = body.ToString();
mailMsg.IsBodyHtml = true;
SmtpClient smtpClient = new SmtpClient("smtp.sina.com");
smtpClient.Credentials = new NetworkCredential("some username", "some password"); smtpClient.Send(mailMsg);
}
}
}

把接口IOrderProcessor和实现类EmailOrderProcessor交给Ninject来实现,以便依赖注入:

private void AddBindings()
{
ninjectKernel.Bind<IProductService>().To<ProductService>();
ninjectKernel.Bind<IOrderProcessor>().To<EmailOrderProcessor>();
}

现在可以在Cart控制器中添加处理订单的逻辑:

using System.Linq;
using System.Web.Mvc;
using MySportsStore.IBLL;
using MySportsStore.Model;
using MySportsStore.WebUI.Abstract;
using MySportsStore.WebUI.Models;
using Ninject; namespace MySportsStore.WebUI.Controllers
{
public class CartController : BaseController
{
[Inject]
public IProductService ProductService { get; set; } [Inject]
public IOrderProcessor OrderProcessor { get; set; } public CartController()
{
this.AddDisposableObject(ProductService);
this.AddDisposableObject(OrderProcessor);
} public ViewResult CheckOut()
{
return View(new ShippingDetail());
} [HttpPost]
public ViewResult CheckOut(Cart cart, ShippingDetail shippingDetail)
{
if (cart.Lines.Count() == 0)
{
ModelState.AddModelError("","购物车为空");
}
if (ModelState.IsValid)
{
OrderProcessor.ProcessOrder(cart, shippingDetail);
cart.Clear();
return View("Completed");
}
else
{
return View(shippingDetail);
}
}
...... }
}

订单提交成功后,显示Cart/Completed.cshtml视图:

@{
ViewBag.Title = "Completed";
Layout = "~/Views/Shared/_Layout.cshtml";
} <h2>谢谢惠顾~~</h2>

运行,点击提交显示:

管理员收到邮件:

至此,订单处理结束。

源码在这里

“MVC项目实践,在三层架构下实现SportsStore”系列包括:

MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

MVC项目实践,在三层架构下实现SportsStore-04,实现分页

MVC项目实践,在三层架构下实现SportsStore-05,实现导航

MVC项目实践,在三层架构下实现SportsStore-06,实现购物车

MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交

MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器

MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务

MVC项目实践,在三层架构下实现SportsStore-10,连接字符串的加密和解密

MVC项目实践,在三层架构下实现SportsStore-11,使用Knockout实现增删改查

MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交的更多相关文章

  1. MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构

    在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...

  2. MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  3. MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  4. MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  5. MVC项目实践,在三层架构下实现SportsStore-04,实现分页

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  6. MVC项目实践,在三层架构下实现SportsStore-05,实现导航

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  7. MVC项目实践,在三层架构下实现SportsStore-06,实现购物车

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  8. MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器

    SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...

  9. MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务

    ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...

随机推荐

  1. javascript中的function

    function / 对象 所有的变量和方法名的:以字母,$ _开头其他随便,尽量使用英文字母命名,见名知意注意点:不允许使用关键字定义变量和方法的名称====函数即方法,方法即函数====百度:ja ...

  2. ORACLE SEQUENCE用法

    引用自: http://www.cnblogs.com/hyzhou/archive/2012/04/12/2444158.html 在oracle中sequence就是序号,每次取的时候它会自动增加 ...

  3. [GE]手动截取当前活动窗口,并且按规则命名(1/2)

    Function Take-ScreenShot { <# .SYNOPSIS Used to take a screenshot of the desktop or the active wi ...

  4. nova.conf部分参数解析

    #----------networking options---------------# #nova的dhcpbridge配置的文件位置 --dhcpbridge_flagfile=/etc/nov ...

  5. OpenCV学习笔记——图像的腐蚀与膨胀

    顺便又复习了一下cvcopy如何进行图像拼接(最近觉得打开多幅图像分别看不如缩小掉放拼接到一幅图像上对比来的好) 首先把拼接的目标图像设置兴趣区域ROI,比如我有一个total,要把a.b.c分别从左 ...

  6. CSS系列:less备忘

    less备忘 //这是一个运行在koala中的less文件,//注释不会被编译到css文件中,/**/注释会 ****************by 李可 2016/04/19 /*所有,所有伪类*/ ...

  7. mysql关于字符串字段数据类型

    字符串类型 字符串类型指CHAR.VARCHAR.BINARY.VARBINARY.BLOB.TEXT.ENUM和SET.该节描述了这些类型如何工作以及如何在查询中使用这些类型. 类型 大小 用途 C ...

  8. NSDate 获取明天、后天的日期

    NSDate *  senddate=[NSDate date];    NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIde ...

  9. Bootstrap页面布局1 - 下载BS(bootstrap简称)

    1.bootstrap 官方网站:http://wrongwaycn.github.io/bootstrap/docs/index.html 2.如图: 3.下载后得到如下目录结构 bootstrap ...

  10. HTML标签之间不是可以随便嵌套的

    深究:我们先来认识in-line内联元素和block-line块元素,因为HTML里几乎所有元素都属于内联元素或者块元素中的一种. in-line这个词有很多种解释:内嵌.内联.行内.线级等,但是,它 ...