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

简介:

提交订单:这是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如需转载请自行联系原作者


张雪飞

相关文章
|
1月前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
|
2月前
|
开发框架 前端开发 API
C#/.NET/.NET Core优秀项目和框架2024年9月简报
C#/.NET/.NET Core优秀项目和框架2024年9月简报
|
3月前
|
开发框架 .NET C#
VSCode开发.net项目时调试无效
【9月更文挑战第22天】在使用 VSCode 开发 .NET 项目时遇到调试问题,可从项目配置、调试配置、调试器安装、运行环境、日志和错误信息等方面排查。确认项目类型及文件配置,检查 `launch.json` 文件及配置项,确保调试器扩展已安装并启用,验证 .NET 运行时版本和环境变量,查看 VSCode 输出窗口和项目日志文件,检查权限及代码错误。若问题仍未解决,可查阅官方文档或社区论坛。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
本文讨论了在基于.NET 6和.NET Framework的WinForms项目中添加图表控件的不同方法。由于.NET 6的WinForms项目默认不包含Chart控件,可以通过NuGet包管理器安装如ScottPlot等图表插件。而对于基于.NET Framework的WinForms项目,Chart控件是默认存在的,也可以通过NuGet安装额外的图表插件,例如LiveCharts。文中提供了通过NuGet添加图表控件的步骤和截图说明。
winform .net6 和 framework 的图表控件,为啥项目中不存在chart控件,该如何解决?
|
2月前
|
存储 消息中间件 前端开发
.NET常见的几种项目架构模式,你知道几种?
.NET常见的几种项目架构模式,你知道几种?
102 0
|
2月前
|
边缘计算 开发框架 人工智能
C#/.NET/.NET Core优秀项目和框架2024年8月简报
C#/.NET/.NET Core优秀项目和框架2024年8月简报
|
2月前
|
Cloud Native API C#
.NET云原生应用实践(一):从搭建项目框架结构开始
.NET云原生应用实践(一):从搭建项目框架结构开始
|
4月前
|
jenkins 测试技术 持续交付
解锁.NET项目高效秘籍:从理论迷雾到实践巅峰,持续集成与自动化测试如何悄然改变游戏规则?
【8月更文挑战第28天】在软件开发领域,持续集成(CI)与自动化测试已成为提升效率和质量的关键工具。尤其在.NET项目中,二者的结合能显著提高开发速度并保证软件稳定性。本文将从理论到实践,详细介绍CI与自动化测试的重要性,并以ASP.NET Core Web API项目为例,演示如何使用Jenkins和NUnit实现自动化构建与测试。每次代码提交后,Jenkins自动触发构建流程,通过编译和运行NUnit测试确保代码质量。这种方式不仅节省了时间,还能快速发现并解决问题,推动.NET项目开发迈向更高水平。
51 8
|
4月前
|
架构师 开发者
【悬念揭秘】DDD:那片隐藏在软件深处的业务乐土——.NET项目如何借力领域驱动设计,让复杂业务逻辑迎刃而解?
【8月更文挑战第28天】领域驱动设计(DDD)在.NET项目中的应用聚焦于将业务领域知识与软件开发紧密结合,通过构建清晰的领域模型管理复杂业务逻辑。DDD的核心概念包括限界上下文、聚合、实体等,确保模型与实现的统一。在.NET中,通过CQRS和事件源等模式提高系统响应性和可扩展性,实现业务事件驱动的解耦与协作。DDD不仅是一种设计方法,更是要求开发者深入理解业务的文化,助力.NET项目应对复杂挑战,实现业务与技术的融合。
69 6
|
4月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
61 5

相关实验场景

更多
下一篇
DataWorks