前面几话都讲的一些有关MVC相关东西,从这话开始应用实战的项目开始。

实战一个简单的购物流程的项目吧!

首先创建一个空白的解决方案,如下图1.

图1.我们预计创建3个模块,一个模块包含我们的域模型(DoMain),一个模块包含我的MVC Web应用程序,还有一个单元测试的模块。

我们的域模型(DoMain)是一个类库项目,然后是一个Asp.Net MVC3 的Web应用程序(Razor引擎)项目,然后添加一个测试项目进来,添加测试项目如下图2.

图2.当我们创建好我们的域模型(DoMain)类库项目和测试项目(类库项目),VS会自动创建一个Class1.cs的文件和UnitTest1.cs的文件,这个对我们来说没有多大的用处,可以直接干掉。之后我们的行么如下图3.

图3.下一步就是添加项目引用,可项目需要用到包(扩展工具/第三方插件),我们项目具体要用到的第三方插件如下:

具体项目 第三插件名称
SportsStore.Domain Ninject
SportsStore.UI Ninject
SportsStore.Domain Moq
SportsStore.UI Moq             

可以在VS里面的"程序包控制管理"用下面的命令导入第三方插件包,命令如下:

Install-Package Ninject -Project SportsStore.WebUI
Install-Package Ninject -Project SportsStore.Domain
Install-Package Moq -Project SportsStore.WebUI
Install-Package Moq -Project SportsStore.Domain

也可以在相关项目上右键,使用NuGet程序包管理一个一个导入,方法根据自己所好,不在啰嗦!

然后就是我们项目的依赖关系,如下表所示:

具体项目 依赖项目
SportsStore.Domain
SportsStore.UI SportsStore.Domain
SportsStore.UnitTests

SportsStore.Domain

SportsStore.UI

因为我们将使用Ninject创建我们的MVC应用程序控制器和处理DI,所以我们需要创建一个新的类更改配置。在SportsStore.UI应用程序里创建一个文件夹(命名"Infrastructure")然后在改文件里创建一个类叫NinjectControllerFactory,它的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Ninject;
using System.Web.Routing;
using Moq;
using SportsStore.Domain.Abstract;
using SportsStore.Domain.Entities;namespace SportsStore.WebUI.Infrastructure
{public class NinjectControllerFactory : DefaultControllerFactory{private IKernel ninjectKernel;public NinjectControllerFactory() {this.ninjectKernel = new StandardKernel();AddBindings();}protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType){return controllerType == null ? null : (IController)ninjectKernel.Get(controllerType);}private void AddBindings(){//绑定额外数据}}
}

我们需要注册NinjectControllerFactory到MVC框架,所以我们也需要在Global.asax.cs里给它注册进去,具体代码如下:

     protected void Application_Start(){AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);//注册路由ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());}

我们可以试着启动跑下我的MVC Web项目,结果如下图4.

图4.如果真出现这个错误页面也是预计必然的结果,接下来的任务就是让这个页面消失吧!

从我们的域模型(DoMain)开始吧!既然我们搞的是一个购物流程的项目,那我们肯定需要商品才能购物,那就在域模型(Domain)里创建一个文件夹(命名"Entities")放相应的模型在该文件夹来创建一个Product类吧!Product类的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;namespace SportsStore.Domain.Entities
{public class Product : Object{public int ProductID { get; set; }public string Name { get; set; }public string Description { get; set; }public decimal Price { get; set; }public string Category { get; set; }}
}

接下来创建一个抽象存储库,我们知道我们用一些方法可以是Prodcut和数据交互,这里我们使用存储库模式,我们不需要担心他是如何去实现,所以在域模型(DoMain)项目里建立一个文件夹(命名"Abstract")在该文件里创建一个接口"IProductRepository",它的代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SportsStore.Domain.Entities;namespace SportsStore.Domain.Abstract
{public interface IProductRepository{IQueryable<Product> Products { get; }}
}

这个接口使用这个IQueryable < T >可以获取Product对象,它没有说任何关于如何或数据存储在哪里或者它将如何被检索。一个类,它使用IProductRepository接口就可以获得Product对象,但是不需要知道任何关于它们来自于哪儿,或者他们如何将被交付到那儿,这是最基本的存储库的模式。

然后我们使用模拟库,因为我们一定定义了一个接口那么我接着就实现它,让他跟数据交互,我们模拟一下实现IProductRepository接口,代码如下:

        private void AddBindings(){//绑定额外数据//模拟IProductRepository实现Mock<IProductRepository> mock = new Mock<IProductRepository>();mock.Setup(h => h.Products).Returns(new List<Product>{new Product {Name="FootBall",Price=25},new Product {Name="Surf Board",Price=179},new Product {Name="Running shoes",Price=95}}.AsQueryable());this.ninjectKernel.Bind<IProductRepository>().ToConstant(mock.Object);}

准备工作的差不多了我们需要要能展现的东西出来才不算前功尽弃,我们要展示出我们的商品,首先要来创建相应的控制器(命名"ProductController"),代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SportsStore.Domain.Abstract;namespace SportsStore.WebUI.Controllers
{public class ProductController : Controller{private IProductRepository repository;public ProductController(IProductRepository productReposittory) {this.repository = productReposittory;}}
}

这个只不过是一个的空的控制器,我们创建了一个构造函数,该函数接收IProductRepository来的参数,这里也就方便Ninject在Product对象实例化的时候的注入(构造注入)。然后我需要返回一个视图展示出来,所以修改ProductController控制器如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using SportsStore.Domain.Abstract;namespace SportsStore.WebUI.Controllers
{public class ProductController : Controller{private IProductRepository repository;public ProductController(IProductRepository productReposittory) {this.repository = productReposittory;}//返回一个视图public ViewResult List(){return this.View(this.repository.Products);}}
}

接下来,需要添加一个视图(View),我们需要创建一个强类型视图,如下图5.

图5.当然在我们选择模型类的时候,下拉框并不能找到IEnumerable<SportsStore.Domain.Entities.Product>,因为他不会包含枚举的域模型(DoMain)对象,所以需要我们手动输入。

IEnumerable<Product>意味着我们可以创建一个列表,现在就用犀利Razor引擎来搞这个页面,List.cshtml页面代码如下:

@model IEnumerable<SportsStore.Domain.Entities.Product>@{ViewBag.Title = "Product List";
}
@foreach (var Product in Model)
{<div class="item"><h3>@Product.Name</h3>@Product.Description<h4>@Product.Price.ToString("C")</h4></div>
}

说明:@Product.Price.ToString("C"),ToString("C")根据你的服务器将数字转换为相应的货币。

然后我们需要修改一下默认的路由,具体的修改如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using SportsStore.WebUI.Infrastructure;namespace SportsStore.WebUI
{// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,// 请访问 http://go.microsoft.com/?LinkId=9394801public class MvcApplication : System.Web.HttpApplication{public static void RegisterGlobalFilters(GlobalFilterCollection filters){filters.Add(new HandleErrorAttribute());}public static void RegisterRoutes(RouteCollection routes){routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute("Default", // 路由名称"{controller}/{action}/{id}", // 带有参数的 URLnew { controller = "Product", action = "List", id = UrlParameter.Optional } // 参数默认值
            );}protected void Application_Start(){AreaRegistration.RegisterAllAreas();RegisterGlobalFilters(GlobalFilters.Filters);RegisterRoutes(RouteTable.Routes);//注册路由ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());}}
}

注明:修改就是上面代码红色部分里标识为蓝色的控制器名称和相应方法(Action)名称。

接下来,在跑下我们的MVC Web应用程序,运行结果如下图6所示.

图6.可以看到我们已经消灭之前的黄页了,项目开始就先搞怎么些东西,后续继续完善。要是那里描述有误还请路过的前辈牛人给点指点,这样才能更好的进步,谢谢!

转载于:https://www.cnblogs.com/HuiTai/archive/2012/07/04/MVC-5.html

第五话 Asp.Net MVC 3.0【MVC实战项目の一】相关推荐

  1. Asp.Net Core 6.0 Mvc入门 图书查询系统 附带源码下载

    Asp.Net Core 6.0 MVC 入门 简介 目标 第一章 创建Asp.Net Core Web应用 第二章 从Model开始 第三章 Model之后皆基架 第四章 运行应用 第五章 数据搜索 ...

  2. ASP.NET CORE 1.0 MVC API 文档用 SWASHBUCKLE SWAGGER实现

    from:https://damienbod.com/2015/12/13/asp-net-5-mvc-6-api-documentation-using-swagger/ 代码生成工具: https ...

  3. ASP.NET Core 2.0 MVC项目实战

     一.前言 毕业后入职现在的公司快有一个月了,公司主要的产品用的是C/S架构,再加上自己现在还在学习维护很老的delphi项目,还是有很多不情愿的.之前实习时主要是做.NET的B/S架构的项目,主要还 ...

  4. ASP.NET Core 2.0 Web API项目升级到ASP.NET Core 3.0概要笔记

    本文结构 先决条件 升级目标框架(Target Framework)的版本 过时的IHostingEnvironment与IApplicationLifetime对象 Endpoint Routing ...

  5. ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作

    ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程. 1.创建项目 选择"文件" > "新建&q ...

  6. ASP .NET Core 2.0 MVC 发布到 IIS 上以后 无法下载apk等格式的文件

    ASP .NET Core MVC 发布到  IIS 上以后 无法下载apk等格式的文件 使用.NET Core MVC创建了一个站点,其他文件可以下载,但是后来又需求,就把手机端的apk合适的文件上 ...

  7. Amazing ASP.NET Core 2.0

    前言 ASP.NET Core 的变化和发展速度是飞快的,当你发现你还没有掌握 ASP.NET Core 1.0 的时候, 2.0 已经快要发布了,目前 2.0 处于 Preview 1 版本,意味着 ...

  8. ASP.NET Core 2.0 使用支付宝PC网站支付

    概述 支付宝有比较多的支付产品,比如当面付.APP支付.手机网站支付.电脑网站支付等,本次讲的是电脑网站支付. 详细 代码下载:http://www.demodashi.com/demo/11730. ...

  9. [.net 面向对象程序设计深入](4)MVC 6 —— 谈谈MVC的版本变迁及新版本6.0发展方向...

    [.net 面向对象程序设计深入](4)MVC 6 --谈谈MVC的版本变迁及新版本6.0发展方向 1.关于MVC 在本篇中不再详细介绍MVC的基础概念,这些东西百度要比我写的全面多了,MVC从1.0 ...

  10. ASP.NET Core 2.0 支付宝当面付之扫码支付

    前言 自从微软更换了CEO以后,微软的战略方向有了相当大的变化,不再是那么封闭,开源了许多东西,拥抱开源社区,.NET实现跨平台,收购xamarin并免费提供给开发者等等.我本人是很喜欢.net的,并 ...

最新文章

  1. Tianchi发布完整开源数据集!
  2. office excel单列数据类型不一致,导入时部分数据为空
  3. W3C DOM操作之创建新节点
  4. Linux运维基础命令笔试题
  5. 【英语学习】【WOTD】teetotaler 释义/词源/示例
  6. JBOSS常用端口说明
  7. 国家开放大学2021春1067知识产权法题目
  8. 两种方案实现word转pdf
  9. Gerber文件总结
  10. TCP/IP、HTTP、HTTPS
  11. 我是一只幼鸟,望着那蓝蓝的天空时不时就想翱翔起来
  12. 记:应聘锐明科技 C++工程师(两个月前就该发了)
  13. Pytorch forward方法调用原理
  14. 孙悟空这个农村人(搞笑)
  15. 拿来就能用的五个前端表白特效(免费)
  16. c语言辅音字符怎么表示,C 语言实例 - 判断元音/辅音
  17. Insert语句的语法
  18. 分析型数据库产品的排头兵GBase 8a
  19. 狂风暴雨——雨过天晴篇:数据流层发布
  20. Android FOTA 升级流程

热门文章

  1. 如何把IDEA项目与上传到Git中
  2. python三大库_Python 经典库汇总(3)
  3. 求解偏微分方程开源有限元软件deal.II学习--Step 12
  4. 第一类边界条件,三角单元剖分,线性插值的位场延拓,LDLT高效求解
  5. 银行账户系统需求分析实例
  6. 算法复习——带修改莫队(bzoj2453)
  7. 【web框架】Django
  8. [转]tar 命令使用
  9. easyui 改变单元格背景颜色
  10. BZOJ3235 [Ahoi2013]好方的蛇 【单调栈 + dp】