MVC模式
MVC开发模式
MVC模式的作用
- 其主要设计目标是将用户接口和逻辑层相分离,以便开发人员更好关注逻辑层的设计和测试,并使整个程序具备清晰的架构
MVC的组成
Modal(模型层)View(视图层)Controller(控制器)
- Model:模型对象是实现应用程序数据域逻辑的应用程序组件,通常被称为“数据模型”。模型对象会检索模型状态并将其存储在数据库中
- View:视图是显示应用程序用户界面 (UI) 的组件。 通常,此 UI 由模型数据创建
- Controller: 控制器是处理用户交互、使用模型并选择视图来显示界面的组件。在 MVC 应用程序中,视图仅显示界面;控制器则用于处理和响应用户输入和交互
MVC程序的目录结构
目录 | 说明 |
---|---|
App_Start | 包含多个静态配置类,执行应用程序的初始化任务 |
Content | 放置应用程序的静态内容 |
Controller | 放置控制器文件,控制器文件是后缀名.cs的文件 |
Models | 放置数据模型对象的文件 |
Views | 放置视图文件,文件后缀名.cshtml或aspx |
Script | 放置JavaScript、jQuery文件 |
MVC路由和数据传递
路由概述:
一个设计良好的URL应满足以下要求:
域名易于记忆和拼写;
简短、已输入;
可以反映出站点的结构;
持久、不能变化。
- MVC应用程序已经存在默认的路由规则定义,其代码在 ./App_Start/ RouteConfig.cs 文件
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default", // 路由名称 名称必须唯一
url: "{controller}/{action}/{id}", // URL模式
defaults: new {
controller = "Home", action = "Index", id = UrlParameter.Optional }); // 定义每个路由参数的默认值
}
}
- 自定义路由规则的配置方法
routes.MapRoute(
name: "News",
url: "{controller}/{action}/{year}-{month}-{day}",
defaults: new {
controller = "Home", action = "News", id = UrlParameter.Optional });
URL格式:http://localhost/Home/News/2012-12-21
控制器传数据给视图
控制器向视图传递少量数据,常见三种为:
- ViewData:字典类型,存放的是键/值对数据。ViewData只在一次HTTP请求中有效,当这次请求结束后,会自动清空其值。
- ViewBag:相当于ViewData,但是内在的实现却完全不一样。 ViewBag存放的不是键值对数据,而是dynamic动态类型数据。
- TempData:默认保存在Session中,控制器每次请求从Session中获取TempData,然后清除Session。基于这样的事实,在每次请求结束后,TempData的生命周期同时结束。
控制器常用返回方法
方法名 | 说明 |
---|---|
ViewResult | 显示特定的View页面 8个重载 |
RedirectToRoutResult | 返回RedirectToAction 方法的结果目的是跳转到本项目的其他 action |
RedirectResult | 返回RedirectAction 的结果目的是跳转页面没有任何限制 |
FileResult | 返回File 方法的结果目的是给客户端输出特定文件 |
ContentResult | 返回Content 方法目的是输出一段字符串 |
JsonResult | 返回Json 方法把对象输出成 Json 对象 |
JavaScriptResult | 返回JavaScript 方法动态输出一段 js |
HttpStatusCodeResult | 返回HttpStatusCodeRestult 方法动态输出状态码(200、400、500等) |
通过EF框架实现列表
ORM概述:
- ORM
- ORM全称是“对象 - 关系映射”
- ORM是将关系数据库中的数据用对象的形式表现出来,并通过面向对象的方式将这些对象组织起来,实现系统业务逻辑的过程
- ORM的具体含义
- O 对应程序中的类
- R 为关系,对应数据库中的关系表
- M 表示程序中对象和数据库中关系表的映射关系
- Entity Framework(简称EF)
- ASP.NET MVC 应用程序推荐使用的ORM框架
- 支持多种数据库
- 映射引擎支持存储过程
- 提供 Visual Studio 集成工具,执行可视化操作
DB First模式
- Database First
- 称为“数据库优先”,即先创建数据库,后生成数据模型
- 该模式的使用前提是数据库已经存在并正常工作。然后使用Visual Studio EF模型设计器,根据数据库生成数据模型
- 在ASP.NET MVC 应用程序中,所有数据模型相关的类,默认放置在/Models目录
- 1、启动EF向导
- 创建ASP.NET MVC 应用程序后,打开 “添加新项” 对话框,选择 “数据” ,并选择 “ADO.NET 实体数据模型”,打开EF向导
- 2、数据库生成
- 点击 “添加” 按钮,在 “实体数据模型向导” 对话框,选择 “从数据库生成(来自数据库的EF设计器)”
- 3、数据库连接
- 点击 “下一步” ,在 “实体数据模型向导” 对话框,创建数据库连接,连接到 “DBName” 数据库,EF向导自动生成连接串
- 4、数据表(勾选所需数据表)
- 5、点击完成
数据库上下文对象DBContext
- EF向导自动生成的 DBTESTEntities 类,称为“数据库上下文操作类”,位于
/Models/Model1.Context.cs
- 生成的Dept,Employee类,称为“业务实体类”
.edmx 文件是一个XML文件,它用于定义概念模型、存储模型和这些模型之间的映射
SSDL 存储模型,之数据库中的实体(将各个实体的关系固定到表中的形式)
CSDL 概念模型,以程序语言的角度定义模型,即其中定义的实体、主键、属性、关联等都是对应于 .NET Framework 中的类型
映射 将概念模型和存储模型连接起来,以便执行操作,即实体.属性(概念模型)对应实体.字段(存储模型)
Razor语法
- Razor
- 不是一种代码语言,而是视图中使用的代码引擎
- 它以简洁的类似客户端的语法结构,呈现网页服务端代码功能
- 它替代了ASPX页面的 “<%…%>” 代码块语法
- 在编写时使用 “@” 开头,“@” 是 Razor的标志
- @…@ Razor注释
Razor语法数据处理在服务器端
Razor语法三种格式:
@表达式
一般
@(表达式)
混用长格式
@{ C#代码块(混HTML) }
多用于处理集合数据块的格式化显示
强类型
- 指变量在定义时已经明确指定其类型。相对于 ”强类型“ 的是 ”弱类型“(object类型就属于”弱类型“)
Model
- 默认情况下,视图中的Model属性可以由试图代码直接访问,并且为动态类型。但是为了提高开发视图的效率和准确性,可以通过明确指定Model的具体类型,而使用 ”强类型“ 数据(强类型可以 . 出属性名)
强类型声明:@model 模型对象(集合)
通过EF框架实现添加
HTML辅助方法输出表单
- 输出超链接写法:
@Html.ActionLink("LinkText","ActionLinkName")
@Html.ActionLink("LinkText","ActionLinkName","ControllerName")
@Html.ActionLink("LinkText","ActionLinkName",new{id=xxx,page=z})
- ASP.NET MVC框架内置多个表单相关的HTML辅助方法
HTML辅助方法 | 说明 |
---|---|
Html.BeginForm() | 输出<form> 标签 |
Html.CheckBox() | 输出<input type="checkbox"> 标签 |
Html.DropDownList() | 输出<select> 标签 |
Html.Password() | 输出<input type="password"> 标签 |
Html.RadioButton() | 输出<input type="radio"> 标签 |
Html.TextArea() | 输出<textarea> 标签 |
Html.TextBox() | 输出<input type="text"> 标签 |
通过EF框架实现数据添加
数据库上下文类用于追踪和识别业务实体对象的变更,是数据库访问操作的入口。没有该类,EF将无法运作下面代码为伪代码
public partial class DBTESTEntities: DbContext // EF框架可自动生成,一般无需改动
{
public EntityTEntities ()
: base("name=EntityTEntities") // 关联数据库连接串
{
}
//用于在上下文对象初始化后执行相关的配置操作
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
throw new UnintentionalCodeFirstException();
}
//业务实体类
public DbSet<Entity> Entity {
get; set; }
}
public class HomeController : Controller
{
public ActionResult Index()
{
Entity entity = new Entity() // 实例化实体对象
{
FieldName = Request["FieldName"]
};
// using语句可自动释放 数据库上下文对象 占用的数据库资源
using (DBNameTEntities db = new DBNameTEntities())
{
db.Dept.Add(entity); // 将数据添加进实体上下文
db.SaveChanges(); // 将更改保存数据库
}
return View();
}
}
MVC上传文件
public ActionResult UploadFile(HttpPostedFileBase fileName) // 暂不做文件类型判断
{
fileName.SaveAs(Request.MapPath("~/upload/") + fileName);
return Content("OK");
}
- 判断文件类型并不是 根据文件的后缀名 而是名的 二进制编码
扩展名 | 二进制码 |
---|---|
JPG | 255216 |
GIF | 7173 |
BMP | 6677 |
PNG | 13780 |
RAR | 8297 |
jpg | 255216 |
exe | 7790 |
xml | 6063 |
html | 6033 |
aspx | 239187 |
cs | 117115 |
js | 119105 |
txt | 210187 |
sql | 255254 |