MVC5+EF6 入门完整教程一
C#ASP.NETMVC5路由系统机制详细讲解(转)
C#MVC5路由系统机制详细讲解(转) MVC5路由系统机制详细讲解转载 MVC5路由系统机制详细讲解https:///slowlifes/article/details/72461440请求⼀个 mvc的⽹站和以前的web form是有区别的, MVC框架内部给我们提供了路由机制,当IIS接受到⼀个请求时,会先看是否请求了⼀个静态资源(.html,css,js,图⽚等),这⼀步是web form和mvc都是⼀样的,如果不是则说明是请求的是⼀个动态页⾯,就会⾛的管道,mvc的程序请求都会⾛路由系统,会映射到⼀个Controller对应的Action⽅法,⽽web form请求动态页⾯是会查找本地实际存在⼀个aspx⽂件。
下⾯通过⼀个 MVC5项⽬来详细介绍⼀下 MVC5路由系统的机制。
⼀、认识Global.asax.cs当我们创建⼀个 MVC5的项⽬的时候会在项⽬的根⽬录中⽣成⼀个Global.asax⽂件。
1public class MvcApplication : System.Web.HttpApplication2 {3protected void Application_Start()4 {5//注册 MVC 应⽤程序中的所有区域6 AreaRegistration.RegisterAllAreas();7//注册全局的Filters8 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);9//注册路由规则10 RouteConfig.RegisterRoutes(RouteTable.Routes);11//注册打包绑定(js,css等)12 BundleConfig.RegisterBundles(BundleTable.Bundles);13 }14 }这个Application_Start⽅法会在⽹站启动的⾃动调⽤,其中我们看到:RouteConfig.RegisterRoutes(RouteTable.Routes);这个就是向 MVC 框架注册我们⾃定义的路由规则,让之后的URL能够对应到具体的Action。
ASP.NETMVC5基础-控制器(Controller)详解
MVC5基础-控制器(Controller)详解在上⽂中我们简单了解了下控制器Controller的作⽤,本⽂我将详细介绍控制器Controller的使⽤⽅法。
Controller的运⾏过程上⽂我们已经讲到,控制器负责响应浏览器传送过来的所有请求。
在MVC中,每⼀个浏览器请求都映射到⼀个控制器(Controller)中,每个请求都会有个动作(Action),只要动作存在,就可以通过该动作⽅法接收客户端传来的请求与决定响应的视图(View)。
我们以之前创建的MVC项⽬为例,打开项⽬的Index.cshtml页⾯。
显⽰的界⾯如下:根据路由规则,Home是控制器(Controller)名,Index是动作(Action)名。
所以这个URL调⽤的是HomeController控制器下的Index⽅法。
在Index⽅法中,只有这么⼀⾏代码:return View();,表⽰返回视图,然后返回给浏览器的是Views/Home⽂件夹下的Index.cshtml页⾯。
虽然我们在Index⽅法中没有指定返回哪个页⾯,但根据 MVC的约定规则,控制器会找到Views⽂件夹中,与Controller名称相同⽂件夹下的同⼀⽅法名的页⾯。
所以返回的是Home下的Index.cshtml页⾯。
具体的有关控制器返回View的内容下⽂会详细说明。
控制器的运⾏过程⼤体如上,从浏览器请求到控制器返回结果的整体流程为:Controller请求参数处理那么在Index⽅法中,正常情况我们可以通过Request.QueryString获取到这两个参数。
如下:public ActionResult Index(){var name = Request.QueryString["name"];var age = Request.QueryString["age"];return Content($"name:{name},age:{age}");}public ActionResult Index(string name,int age){return Content($"name:{name},age:{age}");}打开页⾯输出结果还是⼀样的:相同的,如果浏览器通过POST⽅式传过来⼀个表单,那么我们也可以在Index参数中使⽤表单对应的Model实体类来接收。
.Net MVC基础教程
第17章 MVC基础在应用程序开发中,开发人员很难将应用程序进行良好分层并使相应的页面进行相应的输出,例如页面代码只进行页面布局和样式的输出而代码页面只负责进行逻辑的处理。
为了解决这个问题,微软开发了MVC开发模式方便开发人员进行分层开发。
17.1 了解MVCMVC是一个设计模式,MVC能够将应用程序的视图、模型和控制器进行分开,开发人员能够在不同的层次中进行应用程序层次的开发,例如开发人员能够在视图中进行页面视图的开发,而在控制器中进行代码的实现。
17.1.1 MVC和Web Form在 Web Form的开发当中,用户能够方便的使用微软提供的服务器控件进行应用程序的开发,从而提高开发效率。
虽然 Web Form提高了开发速度、维护效率和代码的复用性,但是现有的编程模型抛弃了传统的网页编程模型,在很多应用问题的解决上反而需要通过复杂的实现完成。
在 MVC模型中, MVC模型给开发人员的感觉仿佛又回到了传统的网页编程模型中(如ASP编程模型),但是 MVC模型与传统的ASP同样是不同的编程模型,因为 MVC模型同样是基于面向对象的思想进行应用程序的开发。
相比之下, MVC模型是一种思想,而不是一个框架,所以 MVC模型与 Web Form并不具有可比性。
同样 MVC模型也不是 Web Form 4.0,这两个开发模型就好比一个是汽车一个是飞机,而两者都能够达到同样的目的。
MVC模型是另一种Web开发的实现思路,其实现的过程并不像传统的应用程序一样。
当用户通过浏览器请求服务器中的某个页面时,其实是实现了 MVC模型中的一个方法,而不是具体的页面,这在另一种程度上实现了URL伪静态。
当用户通过浏览器请求服务器中的某一个路径时, MVC应用程序会拦截相应的地址并进行路由解析,通过应用程序中编程实现展现一个页面给用户,这种页面展现手法同传统的 Web From应用程序与其他的如ASP,PHP 等应用程序都不相同。
MVC5 EF6 入门完整教程八
MVC5+EF6 入门完整教程八本篇是相对独立的一篇,主要讲解不丢失数据进行数据库结构升级。
前面我们讲解EF功能时(见第三篇文章)已经介绍过一种更新数据库的方式:EF比较model和database,如果两边不一致,程序将会drop and re-create数据库。
本篇文章我们会使用code first migrations的方式。
这个功能可以使你改变data model,在不drop and re-create 数据库的情况下更新数据库的结构,将这些改变部署到生产环境中。
下面就着重介绍如何使用此功能。
文章提纲前置条件启用迁移功能执行迁移总结前置条件先回顾下之前EF修改模型的方式。
我们事先配置好EF,每次数据模型改变的时候都会drop and re-create数据库。
例如你增加、删除、改变实体类,或改变DbContext类后,运行程序时将会自动删除已有的数据库,创建一个新数据库来匹配修改后的模型,同样也会根据Seed方法中内容新建test data.这种保持database和data model同步的方法在开发阶段很方便。
如果已经部署到生产环境中就不行了, 例如表中扩充一些字段啥的,原来的数据就不能丢失。
我们禁用原来更新数据库的方式,将web.config中contexts 配置节注释掉。
另外我们不用原来数据,改下数据库名,这样可以生成一个新的数据库,方便做实验。
启用迁移下面就启用Code First Migrations来解决数据库更新的问题。
打开Package Manager Console 连续输入如下指令:enable-migrations 和add-migration InitialCreateenable-migrations指令:a.在项目根目录下创建了一个Migrations文件夹b.在Migrations文件夹下新建一个Configuration.cs文件。
可以通过修改Configuration.cs来对Migration做一些配置(如加入一些测试数据等)Note如果前面没修改web.config的数据库名,执行enable-migrations指令后,Migrations将会找到已有的数据库MVCDemo然后自动执行add-migration指令。
【第二篇】ASP.NETMVC快速入门之数据注解(MVC5+EF6)
【第⼆篇】MVC快速⼊门之数据注解(MVC5+EF6)⽬录数据库连接字符串上⼀篇⽂章中,我们使⽤MVC的模板⾃动⽣成了CRUD的全部操作,但是没有配置数据库连接字符串,那么数据存到什么地⽅了?打开项⽬的App_Data⽬录,你可以发现数据库原来在这⾥:我们通过VS⾃带的数据库访问⼯具,来看下表结构和其中的数据,⾸先找到[服务器资源管理器]⾯板,新增数据库连接:在添加连接向导对话框中,输⼊服务器名:(LocalDb)\MSSQLLocalDB,这个是VS2015⾃带的LocalDb的服务器实例名称(如果你使⽤VS2013,这个名称可能是:(LocalDB)\v11.0)。
数据库选择我们刚刚创建的StudentDbContext。
原来如果没有显式的指定数据库连接字符串,VS会使⽤默认的LocalDb实例,这个对应关系在Web.config中有定义:<entityFramework><defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework"><parameters><parameter value="mssqllocaldb"/></parameters></defaultConnectionFactory><providers><provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer"/></providers></entityFramework>当然我们也可以明确指定数据库连接字符串:<connectionStrings><add name="DefaultConnection"connectionString="Data Source=(LocalDb)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\AspNetMvc.QuickStart.Models.StudentDbContext.mdf;Initial Catalog=AspNetMvc.QuickStart.Models.StudentDbContext;Integrated Security=True" providerName="System.Data.SqlClient"/></connectionStrings>然后在代码中引⽤这个数据库连接字符串:public class StudentDbContext : DbContext{public StudentDbContext() : base("DefaultConnection"){}public DbSet<Student> Students { get; set; }}注意:如果使⽤的VS2013,Data Source应该是(LocalDb)\v11.0,⽽VS2015对应的是(LocalDb)\MSSQLLocalDB。
SpringMVC 快速入门-v5
WebMVC 介绍 ─ MVC是什么
MVC 是一种使用 MVC(Model View Controller 模型-视图-控制器)设计创建
Web 应用程序的模式:
•Model(模型)表示应用程序核心(比如数据库记录列表) •View(视图)显示数据(数据库记录) •Controller(控制器)处理输入(写入数据库记录)
WebMVC 介绍 ─ 常用的MVC框架
比较常用的MVC框架有Struts 和 SpringMVC:
•Struts 是Java Web MVC框架中不争的王者。经过长达九年的发展,Struts已经逐
渐成长为一个稳定、成熟的框架,并且占有了MVC框架中最大的市场份额。但是 Struts某些技术特性上已经落后于新兴的MVC框架。面对Spring MVC、 Webwork2这些设计更精密,扩展性更强的框架,Struts受到了前所未有的挑战。
•什么是MVC模式, MVC模式的优缺点
•SpringMVC对请求的处理流程
•DispatcherServlet类的加载逻辑 •如何快速搭建SpringMVC项目
你可以自己动手实践搭建一个SpringMVC项目,如果想继续提高,你可以继续在 极客学院学习SpringMVC入门实战教程。
•SpringMVC 体系结构
SpringMVC 体系结构
Spring MVC是基于Model 2实现的技术框架。
SpringMVC 快速入门
DispatcherServlet 类
DispatcherServlet 类
本课时包括以下知识点:
•配置DispatcherServlet
•DispatcherServlet的体系结构
•依次继承FrameworkServlet和HttpServletBean
mvc教程
MVC 入门--1、简介什么是MVC模式MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式。
它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Controller)。
那么MVC模式和我们熟悉的WebForm模式有什么不同呢?他的各个部分又是怎样分工的呢?我们先来看一下普通的WebForm模式下,我们请求一个例如http://www.51mvc.co m/blog/index.aspx的URL,那么我们的WebForm程序会到网站根目录下去寻找blog目录下的index. aspx文件,然后由index.aspx页面的CodeBehind文件(.CS文件)进行逻辑处理,其中或许也包括到数据库去取出数据(其中的经过怎样的BLL到DAL这里就不谈了),然后再由index.aspx页面来呈现给用户。
简单的示意图如下所示:也就是一个URL请求的是在服务器与该URL对应路径上的物理文件(ASPX文件或其他),然后由该文件来处理这个请求并返回结果给客户端。
但是,对于MVC模式,这是怎样的一个过程呢?我们先来建一个ASP. NET MVC的项目吧。
VS2008默认是没有 MVC的项目模板的,首先我们需要到http://www.mi /downloads/details.aspx?FamilyId=A24D1E00-CD35-4F66-BAA0-2362BDDE0766&displa ylang=en去下载最新的 MVC的安装程序,目前最新版本的Microsoft MVC Beta(1 0/15/2008)。
下载安装完后,我们可以在新建项目那里找到 MVC的项目:注:如果你的是中文版的VS,安装完后可能会出现找不到这个模板的现象,你可以参考在中文版VS 08中安装MVC这篇文章设置一下。
建立一个 MVC项目后,默认的项目大概如下图:我们可以看到项目中有几个文件夹的命名和MVC(Model-View-Controller,模型—视图—控制器模式)是对应的。
asp.netmvc框架之EF的使用
mvc框架之 EF的使用
一、EF(Entity Framework)简介 1.ORM:Object Relation Mapping,用操作对象的方法来操作数据库 2.ORM工具有很多:Dapper、PetaPoco、NHibernate,其中用的最多的还是微软官方的Entity Framework 3.EF底层仍然是对的封装。EF支持SQLServer、MySQL、Oracle等主流数据库 4.使用EF进行数据库开发的时候有两个步骤需要创建:一个是数据库,另一个是模型类。根据这两种创建的先后顺序有EF的三种创建办 法: a).DataBase First(数据库优先):先创建数据库表,然后自动生成EDM文件,EDM文件生成模型类。 b).Model First(模型优先):先创建Edm文件,Edm文件自动生成模型类和数据库 c).Code First(代码优先):自己写模型类,然后自动生成数据库。没有Edm文件。 DataBase First简单、方便,但是当项目打了之后会非常痛苦;Code First入门门槛高,但是适合大项目。虽然有三种创建方法,一旦创建好 了数据库、模型类之后,后面的用法都是一样的。业界推荐使用Code First,新版的EF中只支持Code irst,所以在以后的使用中,就按照 Code First的方法创建使用EF。 其中EF像 MVC一样,采用的也是"约定大于配置"的设计原则,省去了很多的配置,能用约定就不要自己配置。
如果发生了数据错误,可能就出现在SaveChanges上面。
2.2.1 使用FluentAPI配置方式
mvc教程
mvc教程MVC(Model View Controller)是一种软件架构模式,广泛应用于Web开发领域。
本文将介绍MVC的基本概念、作用以及如何使用MVC进行开发。
首先,MVC模式由三个核心组件组成:模型(Model)、视图(View)和控制器(Controller)。
模型负责处理应用程序的数据逻辑,并管理数据状态。
视图负责向用户展示数据,并接收用户的输入。
控制器作为模型和视图之间的中介,处理用户的请求,并根据请求来更新模型和视图。
MVC的作用是将应用程序的不同职责分离,使代码更加模块化和可维护。
通过将数据逻辑、用户界面和用户交互分离,MVC使开发人员可以更容易地修改和扩展代码,同时也方便多人协作开发。
此外,MVC还可以提高应用程序的可测试性,通过单元测试和集成测试来验证模型、视图和控制器的正确性。
在使用MVC进行开发时,首先需要定义模型、视图和控制器的结构和功能。
模型通常由数据模型和业务逻辑组成,可以使用面向对象编程技术来实现。
视图可以是一个用户界面,可以是一个HTML页面,也可以是其他形式的输出。
控制器负责接收用户的请求,并根据请求执行相应的操作,更新模型和视图。
接下来,需要搭建MVC架构的基础设施,包括路由器、模板引擎和数据库连接等。
路由器负责将用户的请求分发给对应的控制器,并根据请求的路径来决定调用哪个方法。
模板引擎用于处理动态生成的HTML页面,将模型的数据填充到视图中。
数据库连接用于访问数据库并存取数据。
最后,需要编写控制器中的逻辑代码以及模型和视图的数据处理代码。
控制器中的逻辑代码负责接收用户的请求参数、调用模型的方法,并将结果传递给视图渲染。
模型和视图的代码根据具体的业务需求来编写,包括数据查询、数据插入、数据更新等操作。
总结起来,MVC是一种软件架构模式,通过将应用程序的不同职责分离,使代码更加模块化和可维护。
使用MVC可以提高应用程序的可测试性,同时方便多人协作开发。
在使用MVC进行开发时,需要定义模型、视图和控制器的结构和功能,搭建基础设施,编写逻辑代码和数据处理代码。
MVC5+EF6入门教程——实现动态创建数据库与登录验证
MVC5+EF6⼊门教程——实现动态创建数据库与登录验证详细步骤创建⽂件夹,规划好项⽬⽬录创建相关实体类 (Data Model)创建 Database Context创建Initializer, 使⽤EF初始化数据库,插⼊测试数据实现数据库登录验证总结⼀,创建⽂件夹,规划好项⽬⽬录 1.根⽬录下新建⼀个 ViewModels⽂件夹: Models⽂件夹⾥⾯存放对应于数据库表的实体; View中需要显⽰的数据和Models中实体模型不⼀定能对应上,因此需要专门给View使⽤的⾃定义数据模型, 我们称之为ViewModel , 放在 ViewModels⽂件夹⾥⾯。
2.根⽬录下新建⼀个DAL ⽂件夹: DAL 放置数据访问相关类,如MyDbContext.cs, Initializer.cs⼆,创建相关实体类 (Data Model) 为了更加贴近真实情况,我们针对⽤户建⽴三个相关的类。
TbUser, TbRole, TbUserRole TbUser Entitypublic class TbUser{public int Id { get; set; }public string UserName { get; set; }public string Password { get; set; }public string Email { get; set; }public virtual ICollection<TbUserRole> TbUserRoles { get; set; }}View Code TbRole Entitypublic class TbRole{public int Id { get; set; }public string RoleName { get; set; }public string RoleDescription { get; set; }public virtual ICollection<TbUserRole> TbUserRoles { get; set; }}View Code TbUserRole Entityusing ponentModel.DataAnnotations.Schema;namespace TestMVC.Models{public class TbUserRole{public int Id { get; set; }public int UserId { get; set; }public int RoleId { get; set; }[ForeignKey("UserId")]public virtual TbUser TbUser { get; set; }[ForeignKey("RoleId")]public virtual TbRole TbRole { get; set; }}}View Code 对于上⾯⼏个类的约定和说明:EF⽣成数据库时,ID 属性将会成为主键。
ASP.NETMVC5+EF6+EasyUI仓库管理系统
MVC5+EF6+EasyUI仓库管理系统简介 仓库版本与H5⼯作流版本结合此系统是在框架基础上叠加的仓库系统功能,同样是开源的,可以⽤于简单的仓库管理,您也可以在此基础上继续开发与完善!仓库的框架功能会随着框架的升级⽽同样升级,仓库管理售价1666,已经购买过框架的感兴趣的朋友可以差价购买1.⽀持组织架构权限,上级可以看到下级数据2.仓库的所有操作通过⾓⾊组紧密联系,即只对仓库授权的⾓⾊组开放3.所有单据可以指定审核⼈4.系统所有打印没有使⽤报表组件,纯HTML web打印5.所有出⼊库单据设定为:已经确认的单据不能操作6.单据审核成功会进⼊库存数据操作功能介绍数据库字典H5⼯作流(H5⼯作流与Web⼯作流同步数据)基础数据1.仓库管理与授权仓库可以授权⾓⾊组,或者⽤户,只能是授权⽤户才可查看 仓库授权给⾓⾊组样例2.商品管理3.创建与修改界⾯样例⼀、⼊库管理1.⼊库单列表2.创建⼊库单-弹出商品选择3.创建⼊库单-返回弹出选择后的结果集进⾏⾏内修改保存4.对⼊库单进⾏打印⼆、出库管理(出库管理⼤体与⼊库⼀致,⼀进⼀出)1.出库单列表2.新建出库单-弹出选择商品3.创建出库单-返回弹出选择后的结果集进⾏⾏内修改保存4.出库单打印三、调拨管理调拨是从A仓库到B仓库的过程1.调拨单管理页⾯2.创建调拨单-弹出现在库存中可以调拨的商品3.创建调拨单-选择商品后返回可编辑的结果选择A仓库和B仓库的过程4.打印调拨单四、库存查看1.库存管理页⾯2.库存预警设置(可以对商品进⾏库存的预警值,并查询预警商品)3.查看库存的商品进出库与盘点记录五、查询统计报表1.⼊库统计报表 ⼊库统计报表2.出库统计报表3.库存统计报表创建调整单可以对现有库存进⾏调整1.客户管理2.跟进客户3.创建客户。
MVC5+EF6 入门完整教程一
第0课从0开始 MVC开发模式和传统的WebForm开发模式相比,增加了很多“约定”。
直接讲这些”约定” 会让人困惑,而且东西太多容易忘记。
和微软官方教程不同,笔者尽量不用脚手架,从空白框架开始,一步一步添加功能,每次添加的东西刚好够用,让大家能真正能用起来,理解每一个过程。
文章提纲➢概述➢核心概念介绍➢从空白开始,建立一个基本框架详细步骤概述1.本系列文章及文章中的例子主要基于微软官方文档2.使用工具: VS2013 + MS SQL 20123.开始主要讲解MVC + EF搭配使用,后续同样也会提供MVC + 的实现方案核心概念介绍MVC,Model – View – Controller 的简写Model 封装业务逻辑相关的数据及对数据的处理方法View 向用户提供交互界面Controller 负责控制Model和View看下面这张图。
目前只要理解这一个概念就可以了,下面就开始建一个空框架,从做中学。
从空白开始,建立一个基本框架详细步骤一、新建项目NOTE:模板要选Empty,如果直接选MVC会产生多余代码。
NOTE:上图方框处正好对应于M, V, C到此为止,就建立了一个最基本的MVC解决方案,基本是空的。
我们简单介绍下其中的RouteConfig.cs文件打开Global.asax, 注意到在程序启动的时候注册了路由规则,如下方框处。
下面我们就看下具体的路由规则。
打开RouteConfig.cs文件注意到里面有个静态方法,这就是映射路由的控制,这个方法定义了路由规则。
其中:url: "{controller}/{action}/{id}"定义了URL的格式。
后续会结合实际的URL地址来讲解。
二、添加一个示例先不管Model, 我们先创建Controller和View1.添加Controller右键Controllers文件夹,按图示添加。
控制器必须以Controller结尾(这是 MVC的一个约定)。
EF框架入门
EF框架入门教程前言:一、新建一个项目1.我们打开VS2013,项目->新建项目->Visual C#->web 然后选择 Web 应用程序。
名称就随便起一个吧。
我这里就命名FirstEFCode。
然后点击确定。
2、接着下一步,我们要选择MVC。
身份验证,个人账户验证,身份验证不重要,单元测试你看着办,需不需要单元测试。
3、最后点击确定,生成如下的代码构造图二、创建模型1、在model里面右键,添加类。
2、然后选择Visual C#里面的类。
我这里名车个就用Blog。
最后点击添加。
代码如下所示:Blog 类:using System;using System.Collections.Generic;using ponentModel.DataAnnotations; using System.Linq;using System.Web;namespace FirstEFCode.Models{public class Blog{public int BlogId{get;set;}[Display(Name = "分类名称")][Required][StringLength(20)]public string Name { get; set; }public List<Post> Posts { set; get; } }}创建post模型,步骤如上,Post类:using System;using System.Collections.Generic;using ponentModel.DataAnnotations;using System.Linq;using System.Web;namespace FirstEFCode.Models{public class Post{public int PostId{get;set;}[Display(Name = "标题")][Required][StringLength(50)]public string title { set; get; }[Display(Name = "内容")][Required]public string Content { set; get; }public int BlogId{ get; set; }public virtual Blog Blog { set; get; }}}创建上下文:步骤如上面所示:代码如下:AppContext 类:using System;using System.Collections.Generic;using System.Data.Entity;using System.Linq;using System.Web;namespace FirstEFCode.Modelspublic class AppContext :DbContext{public AppContext(): base("Name=AppContext"){}public DbSet<Blog> Blogs{set;get;}public DbSet<Post> Posts{set;get;}}}接着就是添加控制器,控制器在controller里面添加。
原创:MVC5实例教程(MvcMovieStore新概念版:mvc5.0,EF6.01)-。。。
原创:MVC5实例教程(MvcMovieStore新概念版:mvc5.0,EF6.01)-。
上⼀章我们讨论了如何创建项⽬和添加/更新程序包,这⼀章我们讨论⼀下如何创建数据上下⽂和数据实体模型;当然,MVC的运⾏模式⼤家应该都很清楚,MVC 表⽰模型-视图-控制器。
MVC 是⼀种⽤于应⽤程序开发的框架,基于 MVC 应⽤程序中包含:Models:表⽰应⽤程序的数据和使⽤验证逻辑来强制执⾏业务规则的数据的类。
Views:您的应⽤程序⽤来动态⽣成 HTML 响应的模板⽂件。
Controllers: 处理传⼊的浏览器请求的类中检索模型数据,然后指定将响应返回到浏览器中的视图模板。
⾄于如何添加控制器、模型、视图这些概念在这个系列教程中都有详细提到,所以我们并不作为主要讲解内容,在以后的过程中也都会涉及到。
现在我们再来看⼀下Code First,Code First最原始的原型实际上被叫做只有代码(Code Only)。
这是因为开发者只需要写代码,将会⾃动创建模型和数据库。
是因为有⼀个特别的类(继承与System.Data.Entity.DbContext),这个类就是我们即将要谈到的数据上下⽂,⽽数据上下⽂⼜与我们在Web.config中设置的数据连接字符串相对应,数据连接配置和数据上下⽂的关系,这⾥不作过多阐述。
创建数据上下⽂:打开我们上节中已经创建好的项⽬,可以在解决⽅案资源管理器中看到如下图所⽰的IdentityModels.vb这个⽂件,如下图所⽰:从⽂件名我们⼤概可以理解为:⾝份模型,顾名思义就是说这个⽂件中应该是与我们这个项⽬所使⽤的⾝份认证有关的类或者设置。
打开之后我们可以看到两个类:1Imports Microsoft.AspNet.Identity.EntityFramework23' You can add profile data for the user by adding more properties to your ApplicationUser class, please visit /fwlink/?LinkID=317594 to learn more. 4Public Class ApplicationUser5Inherits IdentityUser6End Class78Public Class ApplicationDbContext9Inherits IdentityDbContext(Of ApplicationUser)10Public Sub New()11MyBase.New("DefaultConnection")12End Sub13End ClassApplicationUser:应⽤程序⽤户,ApplicationDbContext:应⽤程序数据上下⽂;不错,项⽬默认已经为我们创建好了数据上下⽂,你可能会问现在这个类怎么不是继承的System.Data.Entity.Dbcontext呀?,那么,我们在IdentityDbContext处点击右键,选择转到定义,如下图所⽰:之后会在⼯作区打开“对象浏览器”窗⼝,从这⾥可以很清楚的看出,IdentityDbContext的继承关系,没看错,他就是继承的System.Data.Entity.Dbcontext;如下图所⽰:也就是说,我们的项⽬中已经有了⼀个数据上下⽂存在,那么我还需要再创建⼀个吗?,对于我们现有的项⽬,不需要多个数据库,⼀个就够我们⽤的了,所以答案是,不需要!需要的是我们对此进⾏扩充。
ASP.NETMVC5+EF6+EasyUI后台管理系统-代码生成器用法
MVC5+EF6+EasyUI后台管理系统-代码⽣成器⽤法
新的代码⽣成器⽐⽼的更加容易使⽤,要⽣成什么形式就选择什么形式,新的代码⽣成器采⽤的是WCF界⾯开发,同样采⽤开源的模式,根据⾃⼰使⽤习惯容易扩展
1.单列表模式
2.树形列表模式
3.左右列表模式
4.左右树形和列表结合模式
5.弹出选择基础表
⼀主界⾯
按界⾯⽣成:可⽣成单个页⾯和左右解决的⽗⼦页⾯,有列表形式和树形模型
⼆单列表模式
任何表都可以⽣成单列表模式
三单树形模式
只有表中存在字段ParentId(上级ID)的表才能被显⽰和⽣成,如果有⾃⼰的规则就修改⽣成代码中ParentId字段为⾃⼰习惯的字段四左右结果模式
1.左右都是列表模式
2.左边是列表,右边是树模式
3.左边是树列表,右边是列表模式
四、弹出窗。
MVC5+EF+AutoFac+AutoMapper轻型架构
MVC5+EF+AutoFac+AutoMapper轻型架构今天和⼤家⼀起学习⼀下当前流⾏的MVC5+EF+AutoFac+AutoMapper轻型架构,先上⼀张框架图⼀、项⽬基本框架搭建写程序的顺序是Model-DAL-BLL-UI,Model层就是表实体,我们略过,下⾯上DAL层代码using Model;using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Text;using System.Threading.Tasks;namespace DAL{public class BaseDal<T> where T : class, new(){public DataModel _currentDbContext = DbContextFactory.GetDbContext();public T Add(T item){return _currentDbContext.Set<T>().Add(item);}public int Count(Expression<Func<T, bool>> predicate){//set<t>针对对上下⽂和基础存储中给定类型的实体的访问返回⼀个 DbSet<TEntity> 实例。
return _currentDbContext.Set<T>().Count(predicate);//返回指定序列中满⾜条件的元素数量。
}public bool Update(T entity){//Attach将实体以“未更改”的状态放置到上下⽂中,就好像从数据库读取了该实体⼀样。
_currentDbContext.Set<T>().Attach(entity);_currentDbContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Modified;return _currentDbContext.SaveChanges() > 0;}public bool Delete(T entity){_currentDbContext.Set<T>().Attach(entity);_currentDbContext.Entry<T>(entity).State = System.Data.Entity.EntityState.Deleted;return _currentDbContext.SaveChanges() > 0;}public bool Exist(Expression<Func<T, bool>> anyLambda){return _currentDbContext.Set<T>().Any(anyLambda);}public T Find(Expression<Func<T, bool>> whereLambda){T entity = _currentDbContext.Set<T>().FirstOrDefault();return entity;}public IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc){var _list = _currentDbContext.Set<T>().Where<T>(whereLamdba);_list = OrderBy(_list, orderName, isAsc);return _list;}///<summary>///排序///</summary>///<typeparam name="T">类型</typeparam>///<param name="source">原IQueryable</param>///<param name="propertyName">排序属性名</param>///<param name="isAsc">是否正序</param>///<returns>排序后的IQueryable<T></returns>private IQueryable<T> OrderBy(IQueryable<T> source, string propertyName, bool isAsc){if (source == null) throw new ArgumentNullException("source", "不能为空");if (string.IsNullOrEmpty(propertyName)) return source;var _parameter = Expression.Parameter(source.ElementType);var _property = Expression.Property(_parameter, propertyName);if (_property == null) throw new ArgumentNullException("propertyName", "属性不存在");var _lambda = mbda(_property, _parameter);var _methodName = isAsc ? "OrderBy" : "OrderByDescending";var _resultExpression = Expression.Call(typeof(Queryable), _methodName, new Type[] { source.ElementType, _property.Type }, source.Expression, Expression.Quote(_lambda));return source.Provider.CreateQuery<T>(_resultExpression);}public IQueryable<T> FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc){var _list = _currentDbContext.Set<T>().Where<T>(whereLamdba);totalRecord = _list.Count();//if (isAsc) _list = _list.OrderBy<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);//else _list = _list.OrderByDescending<T, S>(orderLamdba).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);_list = OrderBy(_list, orderName, isAsc).Skip<T>((pageIndex - 1) * pageSize).Take<T>(pageSize);return _list;}}}BaseDal相信⼤家都能看懂吧,EF框架抽象出来的CRUD⽅法namespace DAL{public class UserInfoDal:BaseDal<UserInfo>,IUserInfoDal{}}UserInfoDalIDAL层代码给⼤家看⼀下,因为我们要解耦各个层之间的⾸先要实现⾯向接⼝编程using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Text;using System.Threading.Tasks;namespace IDAL{public interface IBaseDal<T>{T Add(T item);int Count(Expression<Func<T, bool>> predicate);bool Update(T entity);bool Delete(T entity);bool Exist(Expression<Func<T, bool>> anyLambda);T Find(Expression<Func<T, bool>> whereLambda);IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);IQueryable<T> FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);}}IBaseDalBLL层的代码⼤家都能看懂吧,看不懂的话要多加研究了using DAL;using IDAL;using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Text;using System.Threading.Tasks;namespace BLL{public class BaseService<T> where T:class,new(){public BaseService(IBaseDal<T> currentDal){this._currentDal = currentDal;}protected IBaseDal<T> _currentDal { get; set; }public T Add(T item){return _currentDal.Add(item);}public int Count(Expression<Func<T, bool>> predicate){return _currentDal.Count(predicate);}public bool Update(T entity){return _currentDal.Update(entity);}public bool Delete(T entity){return _currentDal.Delete(entity);}public bool Exist(Expression<Func<T, bool>> anyLambda){return _currentDal.Exist(anyLambda);}public T Find(Expression<Func<T, bool>> whereLambda){return _currentDal.Find(whereLambda);}public IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc){return _currentDal.FindList(whereLamdba, orderName, isAsc);}public IQueryable<T> FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc) {return _currentDal.FindPageList(pageIndex, pageSize, out totalRecord, whereLamdba, orderName, isAsc);}}}BaseService同样⾯向接⼝编程,我们也要抽象出IBLL层,实现与UI的⾯向接⼝using System;using System.Collections.Generic;using System.Linq;using System.Linq.Expressions;using System.Text;using System.Threading.Tasks;namespace IBLL{public interface IBaseService<T> where T:class,new(){T Add(T item);int Count(Expression<Func<T, bool>> predicate);bool Update(T entity);bool Delete(T entity);bool Exist(Expression<Func<T, bool>> anyLambda);T Find(Expression<Func<T, bool>> whereLambda);IQueryable<T> FindList(Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);IQueryable<T> FindPageList(int pageIndex, int pageSize, out int totalRecord, Expression<Func<T, bool>> whereLamdba, string orderName, bool isAsc);}}IBaseService⼆、运⽤AutoFac进⾏依赖注⼊,实现各层次间低耦合。
ASP.NETMVC5+EF6+EasyUI后台管理系统(29)-T4模版
MVC5+EF6+EasyUI后台管理系统(29)-T4模版本节不再适合本系统,在58,59节已经重构。
请超过本节这讲适合所有的MVC程序之前我们发布了⼀个简单的代码⽣成器,其原理就是读取数据库的表结构,⽣成⽂本的⼀个⽅式来⽣成代码!为了替代重复的劳动,微软⾃⼰有⼀套T4模版,我不想把T4模版说得那么的复杂,因为这个复杂我⾃⼰也不知道。
原理跟市⾯的代码⽣成器⼀个道理,但是T4的扩展⽐代码⽣成器更灵活,可以更⽅便根据类⽣成代码等操作。
T4代码模式是没有颜⾊⾼亮了,但是我们的VS⽀持插件下载安装之后就可以跟我们写C#⼀样有智能⾼亮和提⽰了。
新建⼀个项⽬,专门⽤于T4的存放。
⾸先我们要让T4连接我们的数据库新建⼀个DbHelper.ttinclude模版包含⽂件DbHelper.ttinclude这⾥⾯包含了⼀些转换的⽅法和访问数据库的SQL语句其中GetDbTables⽅法就是根据数据库的链接,表名来读取字段数据怎么⽤呢?就是让模版包含这个⽂件,就可以访问⽅法了举⼀个Model为例吧,新建Model⽂件夹。
并新建⽂件,模版⽂件为tt结尾的扩展我们新建Test.tt之后<#@ template debug="false" hostspecific="false" language="C#" #><#@ assembly name="System.Core" #><#@ import namespace="System.Linq" #><#@ import namespace="System.Text" #><#@ import namespace="System.Collections.Generic" #><#@ output extension=".txt" #>最后⼀⾏<#@ output extension=".txt" #>为模版⽣成的⽂件,可以是.cs可以是其他。
c#.netef框架的基础操作
c#.netef框架的基础操作using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Reflection;namespace MCO.EF{public class Test{//实例化上下⽂ConnectionSQL connection = new ConnectionSQL();//增加public int DataAdd(){User user = new User(){UserName = "陆六",UserSex = true};er.Add(user);return connection.SaveChanges();}//删除public int Delete(){List<User> user = er.Where<User>(u => erId > 2).ToList<User>();foreach(User u in user){er.Remove(u);}return connection.SaveChanges();}//修改public int Update(){List<User> user = er.Where<User>(u => erSex == true).ToList<User>();foreach(User u in user){erSex = false;}return connection.SaveChanges();}//查询private void UserList(){IQueryable userList = er.Where<User>(u => erId > 1);//反射获取实体类的所有属性值和属性名PropertyInfo[] attribute = typeof(User).GetProperties();//调⽤ ListToJson ⽅法Console.Write(ListToJson(attribute, userList));}//反射拼接成 jsonprivate string ListToJson(PropertyInfo[] attribute, IQueryable dataList){StringBuilder strJson = new StringBuilder(256);foreach(var data in dataList){strJson.Append("{");for(int i = 0; i < attribute.Length; i++){//获取属性名和属性值(通过反射)strJson.AppendFormat("\"{0}\":\"{1}\",", attribute[i].Name, attribute[i].GetValue(data)); }strJson.Remove(strJson.Length - 1, 1);strJson.Append("},");}strJson.Remove(strJson.Length - 1, 1);return strJson.ToString();}}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第0课从0开始
MVC开发模式和传统的WebForm开发模式相比,增加了很多“约定”。
直接讲这些”约定” 会让人困惑,而且东西太多容易忘记。
和微软官方教程不同,笔者尽量不用脚手架,从空白框架开始,一步一步添加功能,每次添加的东西刚好够用,让大家能真正能用起来,理解每一个过程。
文章提纲
➢概述
➢核心概念介绍
➢从空白开始,建立一个基本框架详细步骤
概述
1.本系列文章及文章中的例子主要基于微软官方文档
2.使用工具: VS2013 + MS SQL 2012
3.开始主要讲解MVC + EF搭配使用,后续同样也会提供MVC + 的实现方案核心概念介绍
MVC,Model – View – Controller 的简写
Model 封装业务逻辑相关的数据及对数据的处理方法
View 向用户提供交互界面
Controller 负责控制Model和View
看下面这张图。
目前只要理解这一个概念就可以了,下面就开始建一个空框架,从做中学。
从空白开始,建立一个基本框架详细步骤一、新建项目
NOTE:模板要选Empty,如果直接选MVC会产生多余代码。
NOTE:上图方框处正好对应于M, V, C
到此为止,就建立了一个最基本的MVC解决方案,基本是空的。
我们简单介绍下其中的RouteConfig.cs文件
打开Global.asax, 注意到在程序启动的时候注册了路由规则,如下方框处。
下面我们就看下具体的路由规则。
打开RouteConfig.cs文件
注意到里面有个静态方法,这就是映射路由的控制,这个方法定义了路由规则。
其中:url: "{controller}/{action}/{id}"定义了URL的格式。
后续会结合实际的URL地址来讲解。
二、添加一个示例
先不管Model, 我们先创建Controller和View
1.添加Controller
右键Controllers文件夹,按图示添加。
控制器必须以Controller结尾(这是 MVC的一个约定)。
后续文章会讲用户登录的例子,所以这里先建一个AccountController.
添加后会发现多了下图方框处的类和文件夹。
我们打开新建的AccountController.cs看下,自动生成了一个方法public ActionResult Index()
{
return View();
}
我们称这个Index为一个Action,返回类型为ActionResult.
可以看到,这个Action返回了一个View, 我们现在来建立这个View
2.添加View
添加View有两种方法,一种是直接在Views文件夹下添加(右键Views Account文件夹)
另外一种是通过Controller中的Action来添加。
这次我们采用后一种方法。
打开AccountController, 右键Index方法,按图示添加。
这样就添加了一个和特定的Controller和Action(这里指AccountController和Index)相对应的View(Views→Account→Index.cshtml)
这个View就是最终显示的前端页面,我们在Body里面添加一行字。
右键Index.cshtml,在浏览器中查看可以看到熟悉的HTML界面了。
注意浏览器中的地址xx/Account/Index
这个地址与开头的路由规则(url: "{controller}/{action}/{id}")就对应了起来,应该很容易理解吧。
典型的一个执行过程。
a.网址路由比对
b.如成功,执行相应的Controller与Action
c.执行相应的View并返回结果
记住这个过程。
后面的过程都会在这个简单的过程中进行扩展。
总结
MVC比之前的WebForm开发方式做了很大改变,分离更彻底。
本次文章主要是让大家建立 MVC的基本观念。
下篇文章主要介绍View的UI设计,介绍一些重点的HtmlHelper, 从前端开始容易看到效果。
后续所有的文章都会以这个示例进行扩展,有问题欢迎大家评论:)。