zl程序教程

您现在的位置是:首页 >  后端

当前栏目

ASP.NET MVC 开发模式(上)

2023-09-14 09:16:29 时间

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");
}
  • 判断文件类型并不是 根据文件的后缀名 而是名的 二进制编码
扩展名二进制码
JPG255216
GIF7173
BMP6677
PNG13780
RAR8297
jpg255216
exe7790
xml6063
html6033
aspx239187
cs117115
js119105
txt210187
sql255254