ASP.NET 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

猜你喜欢

转载自blog.csdn.net/qq_43562262/article/details/107243059