ASP概述Core MVC

作者:史蒂夫·史密斯

ASP。Core MVC是一个丰富的框架,用于使用模型-视图-控制器设计模式构建web应用程序和api。

MVC模式

模型-视图-控制器(MVC)体系结构模式将应用程序分成三组主要组件:模型、视图和控制器。这种模式有助于实现关注点分离。使用此模式,用户请求被路由到控制器,控制器负责与模型一起执行用户操作和/或检索查询结果。控制器选择要显示给用户的视图,并为其提供所需的任何模型数据。

下图显示了三个主要组件,以及哪些组件相互引用:

MVC Pattern

这种职责的描述可以帮助您根据复杂性来扩展应用程序,因为它更容易编码、调试和测试具有单一任务的东西(模型、视图或控制器)。如果依赖关系分布在这三个区域中的两个或更多,那么更新、测试和调试代码将更加困难。例如,用户界面逻辑的变化往往比业务逻辑更频繁。如果表示代码和业务逻辑组合在单个对象中,则每次更改用户界面时都必须修改包含业务逻辑的对象。这通常会引入错误,并且需要在每次最小的用户界面更改之后重新测试业务逻辑。

请注意

视图和控制器都依赖于模型。然而,模型既不依赖于视图,也不依赖于控制器。这是分离的主要好处之一。这种分离允许独立于可视化表示来构建和测试模型。

模型的责任

MVC应用程序中的模型表示应用程序的状态,以及应用程序应该执行的任何业务逻辑或操作。应该将业务逻辑以及用于持久化应用程序状态的任何实现逻辑封装在模型中。强类型视图通常使用ViewModel类型来包含要在该视图上显示的数据。控制器从模型中创建并填充这些ViewModel实例。

视图的责任

视图负责通过用户界面呈现内容。他们使用Razor视图引擎将。net代码嵌入到HTML标记中。视图中应该有最少的逻辑,其中的任何逻辑都应该与呈现内容有关。如果您发现需要在视图文件中执行大量逻辑以显示来自复杂模型的数据,请考虑使用视图组件、ViewModel或视图模板来简化视图。

控制器的责任

控制器是处理用户交互、处理模型并最终选择要呈现的视图的组件。在MVC应用程序中,视图只显示信息;控制器处理并响应用户输入和交互。在MVC模式中,控制器是初始入口点,负责选择使用哪种模型类型和呈现哪个视图(因此得名——它控制应用程序如何响应给定的请求)。

请注意

控制器不应该因为太多的职责而过于复杂。为了避免控制器逻辑变得过于复杂,请将业务逻辑从控制器中推到域模型中。

提示

如果您发现您的控制器操作经常执行相同类型的操作,请将这些常见操作移到过滤器中。

ASP。Core MVC

ASP。. NET Core MVC框架是一个轻量级的、开源的、高度可测试的表示框架,针对asp.net进行了优化。净的核心。

ASP。. NET Core MVC提供了一种基于模式的方式来构建动态网站,从而实现关注点的清晰分离。它让你完全控制标记,支持tdd友好的开发,并使用最新的web标准。

路由

ASP。. NET Core MVC是建立在ASP之上的。它是一个强大的url映射组件,可以让你构建具有可理解和可搜索url的应用程序。这使您能够定义应用程序的URL命名模式,这些模式可以很好地用于搜索引擎优化(SEO)和链接生成,而不必考虑web服务器上的文件是如何组织的。你可以使用一种方便的路由模板语法来定义你的路由,它支持路由值约束、默认值和可选值。

基于约定的路由使您能够全局地定义应用程序接受的URL格式,以及每种格式如何映射到给定控制器上的特定操作方法。当接收到传入请求时,路由引擎解析URL并将其与定义的URL格式之一进行匹配,然后调用相关控制器的操作方法。

路线。MapRoute(name: "Default",模板:"{controller=Home}/{action=Index}/{id?}");

属性路由使您能够通过使用定义应用程序路由的属性装饰控制器和操作来指定路由信息。这意味着你的路由定义被放置在与其关联的控制器和操作旁边。

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

模型绑定

ASP。Core MVC模型绑定将客户端请求数据(表单值、路由数据、查询字符串参数、HTTP标头)转换为控制器可以处理的对象。因此,控制器逻辑不需要计算传入请求数据;它只是将数据作为其操作方法的参数。

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

模型验证

ASP。. NET Core MVC通过用数据注释验证属性装饰模型对象来支持验证。在将值发送到服务器之前,以及在调用控制器操作之前,在服务器端检查验证属性。

使用System.ComponentModel.DataAnnotations;公共类LoginViewModel {[Required] [EmailAddress]公共字符串Email {get;设置;}[必选][DataType(DataType.Password)]公共字符串密码{get;设置;} [Display(Name = "Remember me?")] public bool RememberMe {get;设置;}}

控制器动作:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null) {if (ModelState.IsValid){//与模型一起工作}//此时,某些东西失败了,重新显示form return View(model);}

框架在客户端和服务器上处理验证请求数据。在模型类型上指定的验证逻辑被添加到呈现的视图中,作为不显眼的注释,并在浏览器中使用jQuery Validation强制执行。

依赖注入

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

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

@inject SomeService <!DOCTYPE html> <html lang="en"> <head> <title>@ServiceName。GetTitle</title> </head> <body> <h1>@ServiceName。GetTitle</h1> </body> </html>

过滤器

过滤器帮助开发人员封装横切关注点,如异常处理或授权。过滤器允许为操作方法运行自定义的预处理和后处理逻辑,并且可以配置为在给定请求的执行管道中的特定点运行。过滤器可以作为属性应用于控制器或操作(也可以全局运行)。框架中包含了几个过滤器(如Authorize)。[authorization]是用于创建MVC授权过滤器的属性。

[授权]公共类AccountController: Controller

区域

区域提供了一种划分大型ASP的方法。NET Core MVC Web应用程序分成更小的功能组。区域是应用程序内部的MVC结构。在MVC项目中,像模型、控制器和视图这样的逻辑组件保存在不同的文件夹中,MVC使用命名约定来创建这些组件之间的关系。对于大型应用程序,将应用程序划分为单独的高级功能区域可能是有利的。例如,一个具有多个业务单元的电子商务应用程序,如结帐、计费和搜索等。这些单元中的每一个都有自己的逻辑组件视图、控制器和模型。

Web api

除了作为一个伟大的网站建设平台,ASP。. NET Core MVC对构建Web api有很好的支持。您可以构建覆盖广泛客户端(包括浏览器和移动设备)的服务。

该框架包括对HTTP内容协商的支持,内置支持将数据格式化为JSON或XML。编写自定义格式化程序以添加对自己格式的支持。

使用链接生成来启用对超媒体的支持。轻松启用对跨域资源共享(Cross-Origin Resource Sharing, CORS)的支持,以便您的Web api可以跨多个Web应用程序共享。

可测试性

该框架对接口和依赖注入的使用使其非常适合单元测试,并且该框架包含的特性(如实体框架的TestHost和InMemory提供程序)也使集成测试变得快速和简单。了解有关如何测试控制器逻辑的更多信息。

Razor视图引擎

ASP。. NET Core MVC视图使用Razor视图引擎来呈现视图。Razor是一种紧凑、富有表现力和流畅的模板标记语言,用于使用嵌入式c#代码定义视图。Razor用于在服务器上动态生成web内容。您可以清楚地将服务器代码与客户端内容和代码混合在一起。

<ul> @for (int I = 0;I < 5;i++) {<li>列表项@i</li>} </ul>

使用Razor视图引擎,你可以定义布局、部分视图和可替换的部分。

强类型视图

MVC中的Razor视图可以基于你的模型进行强类型设置。控制器可以将强类型模型传递给视图,从而使视图具有类型检查和智能感知支持。

例如,下面的视图呈现了IEnumerable 类型的模型:

@model IEnumerable<Product> <ul> @foreach (Product p in Model) {<li>@p。名称</li>} </ul>

标签助手

标签助手使服务器端代码能够参与Razor文件中HTML元素的创建和呈现。您可以使用标记帮助器来定义自定义标记(例如 )或修改现有标记的行为(例如

有许多内置的标签助手用于常见的任务——比如创建表单、链接、加载资源等等——甚至更多的可以在公共GitHub存储库和NuGet包中获得。标签助手是用c#编写的,它们根据元素名、属性名或父标签来定位HTML元素。例如,内置的LinkTagHelper可以用来创建指向AccountsController的Login动作的链接:

<p>感谢您确认您的邮件。请<a asp-controller="Account" asp-action="Login">点击这里登录</a>。< / p >

可以使用EnvironmentTagHelper在视图中包含不同的脚本(例如,原始的或缩小的),基于运行时环境,如开发,分期,或生产:

<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.js" asp-fallback-src="~/lib/jquery/dist/jquery.js" asp-fallback-test="window. "jQuery"> </script> </environment>

标签助手为创建HTML和Razor标记提供了HTML友好的开发体验和丰富的智能感知环境。大多数内置的Tag helper都针对现有的HTML元素,并为元素提供服务器端属性。

视图组件

视图组件允许您打包呈现逻辑,并在整个应用程序中重用它。它们类似于局部视图,但具有关联的逻辑。

版本的兼容性

SetCompatibilityVersion方法允许应用程序选择加入或退出ASP中引入的潜在破坏行为更改。. NET Core MVC 2.1或更高版本。

有关详细信息,请参见ASP的兼容性版本。. NET Core MVC。

额外的资源