MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交
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,实现订单提交的更多相关文章
- MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构
在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...
- MVC项目实践,在三层架构下实现SportsStore-02,DbSession层、BLL层
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-01,EF Code First建模、DAL层等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-03,Ninject控制器工厂等
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-04,实现分页
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-05,实现导航
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-06,实现购物车
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-08,部署到IIS服务器
SportsStore是<精通ASP.NET MVC3框架(第三版)>中演示的MVC项目,在该项目中涵盖了MVC的众多方面,包括:使用DI容器.URL优化.导航.分页.购物车.订单.产品管 ...
- MVC项目实践,在三层架构下实现SportsStore-09,ASP.NET MVC调用ASP.NET Web API的查询服务
ASP.NET Web API和WCF都体现了REST软件架构风格.在REST中,把一切数据视为资源,所以也是一种面向资源的架构风格.所有的资源都可以通过URI来唯一标识,通过对资源的HTTP操作(G ...
随机推荐
- JavaScript - 倒计时
http://www.helloweba.com/demo/loading/ WEB开发中经常会用到倒计时来限制用户对表单的操作,比如希望用户在一定时间内看完相关协议信息才允许用户继续下一步操作,又比 ...
- 更新AD对象属性值
1. 对于Set-ADUser不包含的对象属性,可以采用replace来操作 Set-ADUser -Identity 'UserA' -Replace @{userWorkstations = 'C ...
- 【iCore2双核心板视频教程二】iM_LAN 100M 以太网模块TCP通信例程
============================== 技术论坛:http://www.eeschool.org 博客地址:http://xiaomagee.cnblogs.com 官方网店:h ...
- PHP 设计模式 笔记与总结(10)数据对象映射模式 2
[例2]数据对象映射模式结合[工厂模式]和[注册模式]的使用. 入口文件 index.php: <?php define('BASEDIR',__DIR__); //定义根目录常量 includ ...
- redis列表list
Redis Rpush 命令 Redis 列表(List) Redis Rpush 命令用于将一个或多个值插入到列表的尾部(最右边). 如果列表不存在,一个空列表会被创建并执行 RPUSH 操作. ...
- Failed to connect to remote VM. Connection refused. Connection refused: connect.
eclipse debug启动经常出现这个错误,已经启动了debug进程,X掉重新启动即可.
- Arrays类的十大用法
还有很多地方需要细细斟酌 0. 声明数组 String[] aArray = new String[5]; String[] bArray = {"a","b" ...
- 如何删除docker images/containers
docker images往往不知不觉就占满了硬盘空间,为了清理冗余的image,可采用以下方法: 1.进入root权限 sudo su 2.停止所有的container,这样才能够删除其中的imag ...
- JStack分析cpu消耗过高问题
Mark一下, 今天确实用这个方法找到了问题 http://www.iteye.com/topic/1114219 1. top找到目标进程,记下pid 2. top –p pid, 并用shift+ ...
- hitTest:WithEvent 和Responder Chain
这个方法是找到那个View被touch,当找到后就成为响应链的第一个了,如果他不能处理这个Event,那么就找nextResponder 直至application 如果不能处理,那就会丢弃掉. ht ...