原文:Overview of ASP.NET Core MVC

作者:Steve Smith

翻译:张海龙(jiechen)

校对:高嵩

ASP.NET Core MVC 是使用模型-视图-控制器(Model-View-Controller)设计模式构建网页应用与 API 的丰富的框架。

什么是 MVC 模式?

模型-视图-控制器(MVC)架构模式将一个应用区分为三部分主要组件:模型、视图、与控制器。这种模式有助实现关注分离。使用这种模式,用户请求被路由到控制器,控制器负责与模型(Model)协作以执行用户操作和/或返回请求结果。控制器(Controller)选择视图(View),展示给用户,而给视图提供其所需要的任何模型(Model)。

下面的图表展示了这三个主要组件以及它们间的相互引用:

这个职责示意图帮你掌控你的应用的复杂程度,因为其更容易编码、调试、与测试一些(模型、视图、控制器)有单一功能的模块 (进一步了解单一职责原则)。存在两者或者此三者之间的广泛依赖是非常难更新、测试、调试代码的。例如,用户界面逻辑与业务逻辑相比倾向于变化更频繁。如果表现代码与业务逻辑混杂在一个对象内,在你每次改变用户界面的时候都需要修改一个包含业务逻辑的对象。这也就更容易引入错误,并使得你在每次做一个很小的用户界面改动后都要进行完整的业务逻辑测试。

视图与控制器都依赖于模型。尽管如此,模型并不依赖于视图,也不依赖于控制器。这是分离的一大优势。这样分离允许不依赖于视觉表现创建并测试模型。

模型(Model)职责

MVC 应用中的模型代表了应用的状态和业务逻辑或其可以展现的一些操作。业务逻辑应该封装在模型,连同应用持久化状态实现逻辑。强类型视图一般使用特别设计的视图模型(ViewModel)类型,它包含了视图显示需要的数据;控制器将创建并从模型填充这些视图模型。

有许多种方法组织 MVC 架构形式的应用中的模型。了解更多关于 不同类型的模型

视图(View)职责

视图负责在用户界面呈现内容。它们使用 Razor 视图引擎在 HTML 标记中嵌入 .NET 代码。视图中应仅包含少量的逻辑,而这些逻辑应该是与呈现内容相关的。如果你发现需要在视图文件中完成大量的逻辑任务,以便从复杂的模型展示数据,请考虑使用视图组件视图模型、或视图模板来简化视图。

控制器(Controller)职责

控制器是承载用户交互、模型运转、并最终选择视图进行渲染的组件。在 MVC 应用中,视图只显示信息;控制器处理并对用户输入和交互做出响应。在 MVC 模式,控制器是最初的入口,负责选择同哪一个模型类型协作和选择哪一个视图用来呈现(就如其名:它控制应用对所给的请求如何做出响应)。

控制器不应该有太多职责而过于复杂。 为避免控制器逻辑过于复杂,请使用单一职责原则将业务逻辑从控制器移到领域模型。

如果你发现你的控制器方法频繁执行相同类型的方法,你可以依照不要让自己重复原则将这些通用方法移入过滤器.

什么是 ASP.NET Core MVC

ASP.NET Core MVC 框架是一个为使用 ASP.NET Core 优化的轻量级、开源、高度可测试的表现框架。

ASP.NET Core MVC 提供了一种基于模式的、使用干净的关注分离的方式构建动态网站。它使你能对标签完全控制,支持友好的测试驱动开发(TDD)开发方式并且使用最新的 Web 标准。

功能特点

ASP.NET Core MVC 包括以下特点:

  • 路由
  • 模型绑定
  • 模型验证
  • 依赖注入
  • 过滤器
  • 区域
  • 网络应用程序接口
  • 可测试性
  • Razor视图引擎
  • 强类型视图
  • 标签辅助类
  • 视图组件

路由

ASP.NET Core MVC 是建立在ASP.NET Core 路由上的,一项强大的 URL 映射组件,助你建立拥有可理解的、可搜索的 URL 的应用。这使得你可以定义你的应用的 URL 命名形式,使得它对搜索引擎优化(SEO)和链接生成中运行良好,而不用关心你的 WEB 服务器上的文件如何组织。你可以使用方便的路由模板语法定义你的路由,路由模板语法支持路由值约束、默认值和可选值。

基于约束的路由 允许你全局定义你的应用支持的 URL 格式,及这些格式如何各自在给定的控制器中映射到指定的操作(Action)方法。 当接收到传入请求,路由引擎转换 URL 且匹配它至一个定义的 URL 格式模板,然后调用关联的控制器的操作方法。

  routes.MapRoute(name: "Default", template: "{controller=Home}/{action=Index}/{id?}");

特性路由(Attribute routing) 允许你以在控制器和方法使用添加特性的方式指定路由信息来定义你的应用的路由。这意味着你的路由定义紧邻它们所关联的控制器和方法。

  [Route("api/[controller]")]
public class ProductsController : Controller
{
[HttpGet("{id}")]
public IActionResult GetProduct(int id)
{
...
}
}

模型(Model)绑定

ASP.NET Core MVC 模型绑定转换客户端请求数据(从值、路由数据、请求字符参数、HTTP 标头)为控制器可以处理的对象。所以,你的控制器逻辑不需要做识别传入请求数据的工作;使得参数数据传入到操作方法简单化。

  public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) { ... }

模型(Model)验证

ASP.NET Core MVC 支持 校验,通过为你的模型对象添加数据批注校验特性装饰。校验特性在客户端数值传到服务器之前被检查,同时在控制器方法被调用之前也会检查。

  using System.ComponentModel.DataAnnotations;
public class LoginViewModel
{
[Required]
[EmailAddress]
public string Email { get; set; } [Required]
[DataType(DataType.Password)]
public string Password { get; set; } [Display(Name = "Remember me?")]
public bool RememberMe { get; set; }
}

一个控制器方法:

  public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{
if (ModelState.IsValid)
{
// work with the model
}
// If we got this far, something failed, redisplay form
return View(model);
}

框架在客户端和服务端都将处理请求数据校验。在模型上指定的验证逻辑被添加到渲染后的视图中作为隐藏脚本,且利用 jQuery Validation在浏览器中被强制执行。

依赖注入

ASP.NET Core 内置了对 依赖注入 (DI)的支持。在 ASP.NET Core MVC 中 控制器 能通过它们的构造函数请求所需的服务,允许它们遵循 显式依赖项原则

你的应用也可以使用 视图文件中的依赖注入,使用 @inject 命令:

  @inject SomeService ServiceName
<!DOCTYPE html>
<html>
<head>
<title>@ServiceName.GetTitle</title>
</head>
<body>
<h1>@ServiceName.GetTitle</h1>
</body>
</html>

过滤器(Filters)

过滤器帮助开发者封装横切关注点,如异常处理或身份验证。过滤器允许运行为操作方法自定义的前期的和请求过程中的逻辑,也可以被配置为在给定请求的执行管道的特定时刻执行。过滤器可以作为特性被应用到控制器或方法(也可以全局运行)。框架包含了几项过滤器(比如 Authorize )。

    [Authorize]
public class AccountController : Controller
{

区域(Areas)

Areas提供了一种将庞大的 ASP.NET Core MVC 网站应用分解的方法。区域是应用中一项有效的MVC结构。在 MVC 项目中,逻辑组件如 Model、控制器及视图放在不同的文件夹,MVC 使用命名规范来在这些组件间建立关系。对庞大的应用,将应用分解为单独的高级功能区域是非常有益的。例如,一个电子商务应用拥有多个业务单元,比如结算、账单、与搜索等。这些单元中的每一项都有它们各自的逻辑组件视图、控制器和模型。

网络应用程序接口(Web APIs)

除了是一个强大的创建网站的平台,ASP.NET Core MVC 对 Web APIs 也具有强有力的支持。你可以创建服务,连接到广泛的客户端,包括各种浏览器和移动设备。

框架内置支持格式化数据如 JSON 或 XML ,使其具备了对 HTTP 内容协商的支持。编写自定义格式以支持你的自有格式。

使用链接生成可以启用对超媒体的支持。简单地启用对跨域资源共享 (CORS)的支持,可使得你的 Web APIs 能在多个应用间共享。

可测试性(Testablility)

框架接口和依赖注入的使用,使其适合进行单元测试,且框架包含的功能(如 TestHost 和 Entity Framework 内存提供程序)使得集成测试也是非常快捷和方便的。了解更多关于测试控制器逻辑

Razor 视图引擎

ASP.NET Core MVC 视图使用Razor 视图引擎渲染视图。 Razor 是一种紧凑的、表达能力好且流畅的模板标记语言,用来使用嵌入的 C# 代码定义视图。Razor 被用来在服务器动态生成 Web 内容。你可以清晰地将服务端代码和客户端代码跟内容混合在一起。

  <ul>
@for (int i = 0; i < 5; i++) {
<li>List item @i</li>
}
</ul>

使用 Razor 视图引擎你可以定义布局模板,局部视图及可替换的区块。

强类型视图

MVC 中的 Razor 视图可以强类型于你的模型。控制器可以传递强类型模型到视图,使你的视图支持类型检查和智能提示。

例如,下面的视图定义了 IEnumerable<Product> 类型的模型:

  @model IEnumerable<Product>
<ul>
@foreach (Product p in Model)
{
<li>@p.Name</li>
}
</ul>

标签辅助类(Tag Helper)

Tag Helpers使得服务端代码可以在 Razor 文件中参与创建和渲染 HTML 元素。你可以使用 tag helper 定义自己的标签(比如 <environment>)或更改已知标签的行为(如 <label>)。 Tag Helper 依据元素名称和属性绑定到指定元素。它们为服务端渲染带来便利的同时保留了 HTML 编辑体验。

有很多内置的 Tag Helper 应对常用任务,比如创建表单、链接、加载资源等,并且在公共的 GitHub 仓库或作为 NuGet 包,还有更多可用的。Tag Helper 是用 C# 创作的,它们通过元素名、属性名或父标签定位 HTML 元素。例如,内置的 LinkTagHelper 可被用来创建一个链接指向到 AccountsControllerLogin 方法:

  <p>
Thank you for confirming your email.
Please <a asp-controller="Account" asp-action="Login">Click here to Log in</a>.
</p>

EnvironmentTagHelper 可以用来在运行时环境包含不同的脚本到你的视图(例如:原始的或压缩的),例如 Development, Staring, 或 Production:

  <environment names="Development">
<script src="~/lib/jquery/dist/jquery.js"></script>
</environment>
<environment names="Staging,Production">
<script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-2.1.4.min.js"
asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
asp-fallback-test="window.jQuery">
</script>
</environment>

Tag Helper 提供友好的 HTML 开发体验和创建 HTML 与 Razor 标记时的丰富的智能提示。大多数内置的 Tag Helper 指向存在的 HTML 元素并且为元素提供服务端属性。

视图组件

View Components允许你打包渲染逻辑并在应用中重用它。它们与局部视图类似,但具有相关的逻辑。

返回目录

ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览的更多相关文章

  1. ASP.NET Core 中文文档 第四章 MVC(4.4)依赖注入和控制器

    原文: Dependency Injection and Controllers 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core MVC 控制器应通过 ...

  2. ASP.NET Core 中文文档 第四章 MVC(4.1)Controllers, Actions 和 Action Results

    原文:Controllers, Actions, and Action Results 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:许登洋(Seay) Action 和 acti ...

  3. ASP.NET Core 中文文档 第四章 MVC(3.2)Razor 语法参考

    原文:Razor Syntax Reference 作者:Taylor Mullen.Rick Anderson 翻译:刘怡(AlexLEWIS) 校对:何镇汐 什么是 Razor? Razor 是一 ...

  4. [转]ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    本文转自:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html 原文:Filters 作者:Steve Smith 翻 ...

  5. ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...

  6. ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证

    原文:Model Validation 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 在这篇文章中: 章节: 介绍模型验证 验证 Attribute 模型状态 处理 ...

  7. ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证【转载】

    http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_2_2-validation.html 介绍模型验证 在一个应用程序将数据存储到数据库之前,这个应 ...

  8. ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由

    原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...

  9. ASP.NET Core 中文文档 第四章 MVC(3.6.1 )Tag Helpers 介绍

    原文:Introduction to Tag Helpers 作者:Rick Anderson 翻译:刘浩杨 校对:高嵩(Jack) 什么是 Tag Helpers? Tag Helpers 提供了什 ...

  10. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

随机推荐

  1. JAVA语言中的修饰符

    JAVA语言中的修饰符 -----------------------------------------------01--------------------------------------- ...

  2. 视频 - 在 VirtualBox 中部署 OpenStack

    大家新年好,CloudMan 今天给大家带来一件新年礼物. 一直以来大家都反馈 OpenStack 学习有两大障碍:1. 实验环境难搭2. 体系复杂,难道大今天我就先帮大家解决环境问题.前两天我抽空在 ...

  3. MySQL 系列(一) 生产标准线上环境安装配置案例及棘手问题解决

    一.简介 MySQL是最流行的开放源码SQL数据库管理系统,它是由MySQL AB公司开发.发布并支持的.有以下特点: MySQL是一种数据库管理系统. MySQL是一种关联数据库管理系统. MySQ ...

  4. MementoPattern(备忘录模式)

    /** * 备忘录模式 * @author TMAC-J * 用于存储bean的状态 */ public class MementoPattern { public class Memento{ pr ...

  5. android手机登录时遇到“QQ安全登录发现病毒”解决

    android手机作为开源系统非常容易感染病毒,有时候我们会经常遇到手机QQ登录时检测到app被感染,一般情况是由手机感染病毒所引起的,安装腾讯管家后只能检测病毒和卸载感染病毒的软件,不能清除病毒.解 ...

  6. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  7. sql 删除表中的重复记录

    嗯,遇见了表中存在重复的记录的问题,直接写sql删除时最快的,才不要慢慢的复制到excel表中慢慢的人工找呢.哼. 如下sql,找出重复的记录,和重复记录中ID值最小的记录(表中ID为自增长) sel ...

  8. EntityFramework 6 + Mysql 生成POCOs

    问题 使用EDMX文件 EF Power Tools参数不正确的解决方法 对于"异常来自 HRESULT:0x80070057 (E_INVALIDARG)",有方法说" ...

  9. ubuntu14 安装及卸载vmware

    原帖http://blog.sina.com.cn/s/blog_73dac6b50101gp4f.html 适用于ubuntu14和vmware player 12.5

  10. Linux学习日记-使用EF6 Code First(四)

    一.在linux上使用EF 开发环境 VS2013+mono 3.10.0 +EF 6.1.0 先检测一下EF是不是6的 如果不是  请参阅 Linux学习日记-EF6的安装升级(三) 由于我的数据库 ...