l MVC 模式两种理解:
一种是表现模式,另外一种是架构模式。
它将应用程序分成三个主要组件即:视图(View)控制器(Controller)模型(Model)
M:Model 主要是存储或者是处理数据的组件Model其实是实现业务逻辑层对实体类相应 数据库操作,如:
CRUD(C:Create/R:Read/U:Update/D:Delete)。它包括数据、验证规则、数据访问和业务逻辑等应用程序信息。ViewModel:视图模型
V:View 是用户接口层组件。主要是将Model中的数据展示给用户。ASPX和ASCX文件被用来处理视图的职责。
C:Controller 处理用户交互,从model中获取数据并将数据传给指定的view
1、Controller放到controllers文件夹中,并且命名方式以Controller结尾
2、每个Controller都对应View中的一个文件夹,文件夹的名称跟Controller名相同Controller中的方法名都对应一个View视图(非必须,但是建议这么做)而且View的名字跟Action的名字相同
3、控制器必须是非静态类,并且要实现IController接口
4、Controller类型可以放到其他项目中。
1、所有的视图必须放到Views目录下
2、不同控制器的视图用文件夹进行分割,每个控制器都对应一个视图目录
3、一般视图名字跟控制器的Action相对应(非必须)
4、多个控制器公共的视图放到Shared
l 控制器
Action Results的种类
ViewResult – 表示HTML标签类型的结果.
EmptyResult – 表示没有返回结果.
RedirectResult –表示重定向到一个新的URL.
JsonResult – 表示在AJAX应用程序中的一个JavaScript对象格式(JSON)结果。
JavaScriptResult– 表示JavaScript结果.
ContentResult – 表示纯文本结果.
FileContentResult– 表示二进制,可下载的文件结果.
FilePathResult –表示一个路径,可下载的文件结果.
FileStreamResult– 表示一个流,可下载的文件结果.
ASP.NET MVC框架定义了一些方法辅助返回各种类型的ActionResult:
View – 返回一个ViewResult实例的action result.
Redirect –返回一个RedirectResult实例的action result.
RedirectToAction––返回一个RedirectToRouteResult实例的action result.
RedirectToRoute–返回一个RedirectToRouteResult实例的action result.
Json –返回一个JsonResult实例的action result.
JavaScriptResult–返回一个JavaScriptResult实例的action result.
Content –返回一个ContentResult实例的action result.
File –返回FileContentResult、FilePathResult或 FileStreamResult实例,这依赖于传递到方法中去的参数.
ASP.NET MVC 框架包含的HTML Heplers:
Html.ActionLink()
Html.BeginForm()
Html.DropDownList()
Html.EendForm()
Html.Hidden()
Html.ListBox()
Html.Password()
Html.RadioButton()
Html.TextArea()
Html.TextBox()
l ChemCloud启动项
MVC中如何设置路由指定默认页
今天一个刚学MVC的同学,问我MVC中怎么设置默认页,在webform中 只要右键设置起始页就可以,但MVC中却没有这个功能,其实MVC更简单
如下:
Login是控制器,Index 是动作 在全局Global.asax中改动下即可
这个是针对area的默认页
1 2 3 4 5 6 | routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Index", action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "MvcWeb.Areas.Members.Controllers" } ).DataTokens.Add("Area", "Members"); |
这个改动默认控制器
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default",
"{controller}/{action}/{id}",
new {controller = "Login", action = "Index", id = UrlParameter.Optional }
);
启动页面设置
Areas 区域
WebAreaRegistration 文件
public override string AreaName
{
get
{
return "Web";
}
}
public override void RegisterAreaOrder(AreaRegistrationContext context)
{
context.MapRoute("Web_default", "{controller}/{action}/{id}", new { controller = "home", action = "Index", id = UrlParameter.Optional });
}
//web//home//index
l 数据库的EF链接方式
文章提纲
概述 & 要点
详细步骤
总结
概述 & 要点
下面是本文要点,正文部分会有详细介绍。
· EF架构图
· 新建基于EF的Data Model的约定
· 关于ORM的重要概念,和传统方式开发的区别
· EF开发的整体过程
详细步骤
· 新建文件夹,规划好代码摆放位置
· 创建相关类 (Data Model)
· 创建Initializer, 使用EF初始化数据库,插入示例数据
新建文件夹,规划好代码摆放位置
1. 根目录下新建一个 ViewModels文件夹。
Models文件夹里面存放对应于数据库表的实体。
View中需要显示的数据和Models中实体模型不一定能对应上,因此需要专门给View使用的自定义数据模型,我们称之为ViewModel, 放在ViewModels文件夹里面。
1. 根目录下新建一个DAL 文件夹。
DAL 放置数据访问相关类。
NOTE 本文中放AccountContext.cs, AccountInitializer.cs
创建相关类(Data Model)
为了更加贴近真实情况,我们针对用户建立三个相关的类。
SysUser, SysRole,SysUserRole
这是用户权限管理RBAC (Role –Based Access Control)的一个典型模型, 更复杂的模型都可以在这个基础上进行扩展。
OK,下面我们就开始新建这个模型。
我们先去网上找个大致的关系图做参考,打开百度,输入 user role , 搜索图片。
挑一个类似的做参考。
NOTE 权限相关是系统管理范畴的,不涉及具体业务,我起名字的时候都加了Sys前缀,这样和业务区隔开来。
参考上面这个图建立 Data Model
SysUserEntity
SysRoleEntity
SysUserRoleEntity
对于上面几个类的约定和说明:
1. EF生成数据库时,ID 属性将会成为主键。(约定:EF默认会将ID或classnameID生成主键,MSDN建议保持风格的一致性, 都用ID或classnameID, 我们这里都用ID)
2. EF 生成数据库时 , <navigation propertyname><primary key property name>这种形式的会成为外键. ( 约定 )
例如外键 SysUserID = SysUser(navigation property)+ID(SysUser的主键)
3. 定义为virtual的几个属性是navigation 属性(virtual非必须, 只是惯例用法, 后面文章将会讲解用virtual的好处).
navigation 属性保存着其他的关联entity(entities)
示例中, SysUser和SysUserRole是一对多的关系, SysRole和SysUserRole也是一对多的关系.
如果是 "多", 属性类型就必须是list( 这里用的是Icollection )
创建 Database Context
前置条件:安装EF
打开 工具à库程序包管理器à程序包管理器控制台
输入 install-package entityframework
从上图可以看出,EF框架在底层是通过调用ADO.NET来实现数据库操作的。
多转一道弯性能和灵活性肯定会受到影响,所以本系列文章结束后同样也会给出MVC+ADO.NET的方案,大家可以根据需要选择。
NOTE
微软官方推出的ORM框架主要有Linq to SQL和Entity Framework.
EF是目前最新的,也是推荐配合MVC使用的框架。
实际操作前再补充一些重要概念:
如果不用ORM框架,我们一般这样来使用ADO.NET进行数据库开发:
1. 将ADO.NET对数据库的操作封装到一个类里SqlHelper中
2. 在DAL层调用SqlHelper
3. 其他层再调用DAL进行数据库操作
使用ORM之后,以前面的SysUser为例:
O(Object) à 程序中的类 SysUser, 就是对象
R (Relation)à 数据库中的表
M(Mapping)à O和R的映射关系
ORM对传统方式的改进:
充当桥梁,实现了关系数据和对象数据的映射,通过映射自动产生SQL语句。
对常用的操作,节省了写SQL语句的步骤。
好了,现在必要的概念应该理解了吧,下面我们就进行实际的操作了。
创建类 AccountContext.cs , 让他继承自System.Data.Entity.DbContext, 我们用这个类完成EF的功能。
主要做下面三件事:
1. 为每个entity set创建一个DbSet
在EF中,通常情况下一个entity set对应数据库中的一张表,一个entity对应表中的一行。
2. 指定一个连接字符串
构造函数中的 base("AccountContext") 。
默认情况下和类名一样,即AccountContext,我们显式的给他指定出来。
3. 指定单数形式的表名
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();
默认情况下会生成复数形式的表,如SysUsers
NOTE 表名用单复数形式看各自的习惯,没有明确的规定。有的公司表名全用单数,有的公司根据表的意思,有单数也有复数。
配合上面第2点,先把web.config中连接字符串给指定了。
如下图,贴着appSettings配置节上面添加。
NOTE AttachDBFilename=|DataDirectory|\MVCDemo.mdf设定了数据库文件的存放位置:在项目根目录的App_Data文件夹下。
理论基础 -- EF 三种编程方式 (略)
总共有三种方式:
Database First,ModelFirst和Code First