提交订单:这是SportsStore项目的最后一个功能了,结算并完成我们的订单。

在Entities文件夹里添加一个ShippingDetails.cs,代码如下:

View Code

注意这里给属性添加了一些validation attributes,需要引入一个命名空间:System.ComponentModel.DataAnnotations。

添加结算处理:我们的目标是能够让用户添加快递信息和提交订单。首先我们在购物车详情页面添加一个Checkout按钮,修改Views/Cart/Index.cshtml如下:

<p align="center" class="actionButtons">
<a href="@Model.ReturnUrl">Continue shopping</a>@Html.ActionLink("Checkout now", "Checkout")
</p>

接着我们在CartController里面添加一个Checkout action方法,如下:

        public ViewResult Checkout()
{return View(new ShippingDetails());
}

右键添加一个视图Checkout,如下:

Checkout.cshtml的代码如下:

View Code

我们使用Html.EditorFor辅助方法为每一个表单字段呈现input元素,我们让MVC框架能够算出view model属性需要哪一种input元素,而不是显示的指定。Html.EditorFor方法是Template View Helper一个例子,书后面的章节会进行详细的讲解。这里我们能体验到,MVC框架非常智能,会自动为bool类型的属性呈现一个Checkbox(这里的Gift Wrap).

Tip:我们可以使用一个简单的方法Html.EditorForModel来为所有的属性创建HTML元素.将上面的代码注释,然后加上@Html.EditorForModel().运行程序可以看看效果。我们这是分开写的,为的是能够直接引用每一个属性。

接着实现订单处理过程

我们需要一个组件来处理订单的详情,为了保持MVC model的严则,首先定义一个接口,并实现该接口。然后使用我们的DI容器--Ninject
在 SportsStore.Domain/Abstract的文件夹里面定义一个IOrderProcessor接口,如下所示:

View Code

接着实现该接口,这里比较简单的处理,仅仅发一封邮件告之。在 SportsStore.Domain/Concrete里面创建一个EmailOrderProcessor类来实现该接口,如下所示:

View Code

接着使用Ninject绑定,在NinjectControllerFactory的修改AddBindings()如下:

        private void AddBindings()
{
ninjectKernel.Bind<IProductsRepository>().To<ProductsRepository>();

EmailSettings emailSettings = new EmailSettings {  WriteAsFile = bool.Parse(ConfigurationManager.AppSettings["Email.WriteAsFile"] ?? "false") }; ninjectKernel.Bind<IOrderProcessor>().To<EmailOrderProcessor>().WithConstructorArgument("settings", emailSettings);
}

对了,这里的Email.WriteAsFile在配置文件里面配置的,主要是考虑没有smtp服务器时,将邮件复制到指定目录。其实一般的邮箱都开通了smtp服务的,所以我们将这里的默认值设为false。在Web.config里面配置<add key="Email.WriteAsFile" value="false"/>
在Ninject里面绑定时,这里是带了构造器参数,如果初次路过的朋友不是很清楚,可以看前面的比较,有针对Ninject的介绍。

接着完成CartController

我们需要修改CartController的构造器,现在需要增加IOrderProcessor类型的参数,并且需要增加一个新的action方法来处理当用户点击完成订单按钮后的post请求。修改后如下:

        private IProductsRepository repository;private IOrderProcessor orderProcessor;public CartController(IProductsRepository repo, IOrderProcessor proc)
{
repository = repo;
orderProcessor = proc;
}

[HttpPost]public ViewResult Checkout(Cart cart, ShippingDetails shippingDetails)
{if (cart.Lines.Count() == 0)
{
ModelState.AddModelError("", "Sorry,your cart is empty!");
}if (ModelState.IsValid)
{
orderProcessor.ProcessOrder(cart, shippingDetails);
cart.Clear();return View("Completed");
}else
{return View(shippingDetails);
}
}

这里可以发现有这样一个[HttpPost]特性修饰Checkout方法,表示该方法只有发起post请求时才会被调用。当用户提交表单以后,这里又一次用到了Model Binding系统,分别针对ShippingDetails自动来自http的数据创建参数和Cart使用我们自定义的绑定模型创建参数。如果你使用了单元测试,这个是需要修改CartController的构造器,可以增加一个null参数来使编译通过。

MVC框架通过使用data annotation attributes检查我们对ShippingDetails应用的验证约束,任何的验证都会通过ModelState传递给action方法。我可以通过检查ModelState.IsValid属性来确定验证过程产生的问题,比如是否为空等等。注意到这里,如果没有任何的项在购物车里面,我们能够调用ModelState.AddModelError方法来注册一个错误的信息.关于Model Binding和validation,书中第二部分有章节进行专门的讲解,如果你这里跟我一样不太清楚,没问题的。

展示验证信息

当用户输入了不合法的数据时,我们可以使用@Html.ValidationSummary()在显示,当然这是在一个地方统一显示。你也可以借助其他的方法来分开显示不同的错误信息。比如这修改Checkout.cshtml如下:

...
<h2>Check out now</h2>
Please enter your details, and we'll ship your goods right away!
@using (Html.BeginForm()) { 

    @Html.ValidationSummary() 

    <h3>Ship to</h3>     <div>Name: @Html.EditorFor(x => x.Name)</div> ... 

展示效果如下:

接下进行最后一步了,当用户填完了Ship信息时,给用户显示一个完结的页面Summary。右键Checkout方法,添加视图Completed,这里不用强类型视图。因为就显示一个成功信息而已。代码如下:

View Code

好啦,今天的笔记就到这里。

下一章也是关于该项目的,也是第一部分的最后一章了,正在学习mvc的朋友请一起坚持。到了第二部分,就进入mvc详细讲解部分了,我觉得是最核心的部分,我相信在这个项目里面我们所有的疑惑和问题都会在第二部分的内容得到答案。你相信吗?呵呵!

晚安!

本文转自Rt-张雪飞博客园博客,原文链接http://www.cnblogs.com/mszhangxuefei/archive/2012/01/12/mvcnotes_16.html如需转载请自行联系原作者

张雪飞

《Pro ASP.NET MVC 3 Framework》学习笔记之十六【示例项目SportsStore】相关推荐

  1. ASP.NET MVC 3 Framework 学习笔记

    前段时间因项目需要对ASP.NET MVC3进行了系统的学习,完成项目后感觉对原书中有些知识点还有一些理解不够透彻的地方,因此将<Freeman A. Sanderson S. -  Pro A ...

  2. 《Pro ASP.NET MVC 3 Framework》学习笔记之十七【示例项目SportsStore】

    接下来是关于SportsStore的后台管理功能,也就是通常的CRUD操作. 首先添加一个AdminController,代码如下: View Code using System.Web.Mvc; u ...

  3. 《Pro ASP.NET MVC 3 Framework》学习笔记之十三【示例项目SportsStore】

    接着我们添加一个分页功能.修改ProductController,如下所示: public class ProductController : Controller {public int PageS ...

  4. 《Pro ASP.NET MVC 3 Framework》学习笔记之一【MVC的历程,优点,HelloWorld】

    序论:asp.net mvc出现已经有两三年的时间了(2009开始1.0版本),但是这么方面的中文学习资料仍然非常少,特别是asp.net mvc3,几乎就没有中文的学习书籍.在英文的书籍中有两本是非 ...

  5. ASP.Net MVC开发基础学习笔记(5):区域、模板页与WebAPI初步

    http://blog.jobbole.com/85008/ ASP.Net MVC开发基础学习笔记(5):区域.模板页与WebAPI初步 2015/03/17 · IT技术 · .Net, Asp. ...

  6. 《Pro ASP.NET MVC 3 Framework》英文原版教材个人勘误

    2011年6月27日,Apress今年比较吸引人的<Pro ASP.NET MVC 3 Framework>一书终于发布了. http://www.apress.com/978143023 ...

  7. [go学习笔记.第十六章.TCP编程] 3.项目-海量用户即时通讯系统-redis介入,用户登录,注册

    1.实现功能-完成用户登录 在redis手动添加测试用户,并画出示意图以及说明注意事项(后续通过程序注册用户) 如:输入用户名和密码,如果在redis中存在并正确,则登录,否则退出系统,并给出相应提示 ...

  8. OpenCV学习笔记(十六)——CamShift研究 OpenCV学习笔记(十七)——运动分析和物体跟踪Video OpenCV学习笔记(十八)——图像的各种变换(cvtColor*+)imgproc

    OpenCV学习笔记(十六)--CamShift研究 CamShitf算法,即Continuously Apative Mean-Shift算法,基本思想就是对视频图像的多帧进行MeanShift运算 ...

  9. OpenCV学习笔记(十六):直方图均衡化:equalizeHist()

    OpenCV学习笔记(十六):直方图均匀化:equalizeHist() 参考博客: 直方图均衡化的数学原理 直方图匹配的数学原理 直方图均衡化广泛应用于图像增强中: 直方图均衡化处理的"中 ...

  10. QT学习笔记(十六):setwindowflags的属性总结

    QT学习笔记(十六):setwindowflags的属性总结 此枚举类型用于为小部件指定各种窗口系统属性.它们是不常用的,但在一些情况下是必要的.其中一些标志取决于底层窗口管理器是否支持它们. 主要类 ...

最新文章

  1. 微软应用架构指南(第2版)出版
  2. java修改JFrame默认字体
  3. 赞,全网开发者都在学的 26 门 AI 课程!
  4. 配置babel_Babel 7 下配置 TypeScript 支持
  5. Bootstrap3 警告框插件的使用方法
  6. qt可以导入3d吗_3D全息投影技术可以用在教育行业吗?
  7. Java使用C3P0连接池详解
  8. 卧槽!AI 质检竟然还能这么玩???
  9. 品优购06——运营商后台(商品管理)
  10. 西安航空计算机录取分数线,2019西安航空学院录取分数线及历年专业分数线统计表【文科 理科】...
  11. 比较全面的安全测试用例设计思路
  12. POJ Curling 2.0
  13. 求生之路显示服务器ip,求生之路云服务器开服教程
  14. ios开发收藏按钮_iOS使用CoreData实现收藏功能
  15. 一个不错的网站,颜色推荐 http://www.colorhexa.com/
  16. 学习ps能做些什么呢
  17. 2021-2027全球与中国精密金属零部件市场现状及未来发展趋势
  18. 箱线图(seaborn.boxplot)
  19. BowtieXP.v6.0.7+DecisionTools Suite v7.5风险管策析
  20. 亚马逊云科技构建Serverless数据分析战略

热门文章

  1. 也许每个农村出来的码农都有个田园梦
  2. Linux 网卡驱动相关——03
  3. ActionScript 3.0 Step By Step系列(五):走在面向对象开发的路上,以类为基础去思考编程问题...
  4. Python中fnmatch模块的使用
  5. ELK安装配置,日志展示
  6. [Poi2010]Antisymmetry
  7. 软件需求管理用例方法三
  8. BZOJ 1040 骑士
  9. JVM第三篇 — JVM是怎么工作的?
  10. 2010年最火与最冷的IT职业