ASP.NET Core 中的 MVC架构

MVC 架构

MVC架构把 App 按照逻辑分成三层:

  • Controllers,接收 http request,配合 model,通过http response 返回 view,尽量不做别的事
  • Models, 负责业务逻辑,App 的状态,以及数据处理
  • Views,呈现 UI,如果UI 较复杂,应该使用View 组件, ViewModel, 或者 view 模板

Controller

ASP.NET Core MVC 中的所有 Controller 都继承于 Controller 基类,而 ASP.NET Core WEB API 中的 Controller 都继承于 ControllerBase 基类,是因为Controller 基类支持 View。
Controller 可以返回三种类型的结果:

  • HTTP 状态码 或者 Redirect 结果
  • View 或者 格式化的结果(比如:Json(customer))
  • 与 Client 请求协商的结果

View

View 是使用 Razor 引擎标记的 HTML 模板页面。
Razor 引擎标记在服务端生成 HTML。
HMTL 中的 Razor 标记以 @ 开头,中间是{ … }。比如:

@{ViewData["Title"] = "About";
}

具体语法参考:
https://learn.microsoft.com/en-us/aspnet/core/mvc/views/razor?view=aspnetcore-8.0#razor-syntax
ASP.NET Core MVC 中的一个 View 是一个 .cshtml 代码文件。
在这里插入图片描述
一般一个 Controller 对应一个 View 文件夹,一个Action 可能对应一个 View。
View 的文件夹结构一般是:Views/[ControllerName] 。
多个 Controller 共享的 View 放在 Views/Shared 中。
View 的名称一般与 Action 的名称相同。
如果Action返回的 View 不指定具体View名称,则返回与 Action 方法相同的 View。
此时 ASP.NET Core 会从Views/[ControllerName]和Views/Shared 中查找同名 View。

return View();

Action 也可以显示指定 View 名称:

return View("Orders");

Action 显示指定 View 名称的时候,使用相对路径:

return View("../Manage/Index");

或者:

return View("./About");

Action 也可以不指定名称,但指定 Model:

return View(Orders);

Action 也可以同时指定名称和 Model:

return View("Orders", Orders);

向 View 传递数据可以使用强类型的 ViewModel 或者弱类型的 ViewData

ViewModel

也可以向 View 传一个 ViewModel,ViewModel是用于 View 的强类型 Model。
强类型意味着每个View 中的变量都在Model有对应的定义,使用 @model 指令:

@model WebApplication1.ViewModels.Address<h2>Contact</h2>
<address>@Model.Street<br>@Model.City, @Model.State @Model.PostalCode<br><abbr title="Phone">P:</abbr> 425.555.0100
</address>

然后通过 return View(ViewModel) 传递给View:

public IActionResult Contact()
{ViewData["Message"] = "Your contact page.";var viewModel = new Address(){Name = "Microsoft",Street = "One Microsoft Way",City = "Redmond",State = "WA",PostalCode = "98052-6399"};return View(viewModel);
}

ViewModel 类一般就是一个 POCO 类,即只有属性,没有方法的数据类。

ViewData

ViewData 是一个kv 结构的字典结构数据。
弱类型意味着即使 View 中找不到数据,也不会报错。
比如在 View 中使用的ViewData[“Greeting”]和ViewData[“Address”]:

@{// Since Address isn't a string, it requires a cast.var address = ViewData["Address"] as Address;
}@ViewData["Greeting"] World!<address>@address.Name<br>@address.Street<br>@address.City, @address.State @address.PostalCode
</address>

通过 Action 中定义后通过return View() 传给 View:

public IActionResult SomeAction()
{ViewData["Greeting"] = "Hello";ViewData["Address"]  = new Address(){Name = "Steve",Street = "123 Main St",City = "Hudson",State = "OH",PostalCode = "44236"};return View();
}

也可以通过ViewData 属性定义:

public class HomeController : Controller
{[ViewData]public string Title { get; set; }public IActionResult About(){Title = "About Us";ViewData["Message"] = "Your application description page.";return View();}
}

Partial View

当需要拆分大型 View 或者复用小型View时,可以使用 Partial View功能。
Partial View 中没有 @page 指令。
Partial View 不运行 _ViewStart.cshtml。
Partial View 的名称通常以下划线 _ 开头。
Action 返回 Partial View:

public IActionResult OnGetPartial() =>Partial("_AuthorPartialRP");

在 View 中通过 Tag Helper 使用 Partial View:

<partial name="_PartialName" />

Partial View 的搜索路径

MVC 中:

  1. /Areas//Views/
  2. /Areas//Views/Shared
  3. /Views/Shared
  4. /Pages/Shared

Razer Page 中:

  1. 当前页面文件夹
  2. 当前页面的上一级文件夹
  3. /Shared
  4. /Pages/Shared
  5. /Views/Shared

异步 HTML Helper

使用HTML Helper时,一般使用 PartialAsync。
PartialAsync 返回 Task 类型的 IHtmlContent。

@await Html.PartialAsync("_PartialName")

Layout

Web App 一般都有布局,类似这样:
在这里插入图片描述
默认的布局文件名放在 Views/Shared/_Layout.cshtml 。
Layout 中一般会调用:

@RenderBody()

Layout 中可以引用多个部分,每个部分通过RenderSection替换:

<script type="text/javascript" src="~/scripts/global.js"></script>@RenderSection("Scripts", required: false)

路由 Routing

路由的作用是把客户端的 http 请求 url 映射到Controllers的具体类的具体 Action 上。
路由语法可以参考 https://blog.csdn.net/cuit/article/details/132587534
比如:

初始时时基于约定的路由:

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

Controller中基于属性的路由:

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

Model 绑定

Model 绑定功能把客户端的请求数据(表彰数据,路由数据,请求字符串,HTTP header)转换成 controller可以接收的对象。这样,controller 就不用分析请求数据,直接把请求数据作为 Action 的入参。

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

Model 验证

使用Model 绑定功能后,可以在客户端发送请求之前就验证请求数据,以及在 Action 处理之前验证数据。

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; }
}

Action的代码:

public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
{if (ModelState.IsValid){// work with the model}// At this point, something failed, redisplay formreturn View(model);
}

.NET 会同时在客户端和服务端进行 Model 验证。

依赖注入

可以在 Controller 的构造函数中注入依赖类,也可以在 View 中使用 @inject 指令注入:

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

筛选器 Filters

Filters 用于预处理或者后处理 pipeline 中的请求,比如异常处理,缓存,Authorization,日志。
比如:
在这里插入图片描述

Areas

Areas 用于分组功能。
MVC 架构中,Model, Controller, 和 View 代码放在不同的物理文件夹中。
而在大型 App 中,还需要把每个Controller/Model/View模块按功能放在不同的子分组中。

强类型的 View

Controllers 可以向 View 返回一个强类型 Model 的 View。
比如这个类型为IEnumerable的 View。

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

Tag Helpers

Tag Helpers 用于 server 端生成 HTML。
Tag Helpers 可以自定义 HTML元素或者修改现有 HTML 元素。
Tag Helpers 绑定到 HTML元素的属性上。
Tag Helpers 有原生支持和第三方开发的。
比如:LinkTagHelper 可以用于创建指向AccountsController.Login 的链接。

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

比如:EnvironmentTagHelper 可以用于根据环境使用不同的 HTML:

<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>

内置的Tag Helpers

  • asp-controller 和asp-action,生成 URL,比如:
<a asp-controller="Speaker"asp-action="Evaluations">Speaker Evaluations</a>

生成:

<a href="/Speaker/Evaluations">Speaker Evaluations</a>
  • asp-route,asp-all-route-data,asp-route-{value},asp-area,匹配路由
  • asp-fragment,生成 html 锚点
  • asp-protocol,指定 http 协议,比如 https
  • asp-host,指定 url 的主机名
  • asp-page,生成 hrel 的超链接
  • cache,distributed-cache,缓存数据
  • environment,根据环境使用不同的 HTML
  • form,生成表单
    • formaction,提前表单
    • input,
    • label
    • select
    • textarea
    • asp-validation-for
    • asp-validation-summary
  • img,加强img标签。
  • Link 类
    • href
    • asp-fallback-href
  • partial,partial view
  • script

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/125454.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

借助AI分析哥斯拉木马原理与Tomcat回显链路挖掘

前言 本次分析使用了ChatGPT进行辅助分析&#xff0c;大大提升了工作效率&#xff0c;很快就分析出木马的工作流程和构造出利用方式。 分析 首先对该木马进行格式化,以增强代码的可读性。得到如下代码 <jsp:root xmlns:jsp"http://java.sun.com/JSP/Page" vers…

如何解决前端传递数据给后端时精度丢失问题

解决精度丢失 有时候我们在进行修改操作时&#xff0c;发现修改既不报错也不生效。我们进行排查后发现服务器端将数据返回给前端时没有出错&#xff0c;但是前端js将数据进行处理时却出错了&#xff0c;因为id是Long类型的&#xff0c;而js在处理后端返回给前端的Long类型数据…

职责链设计模式

职责链模式又叫命令链、CoR、Chain of Command、Chain of Responsibility。 该模式允许你将请求沿着处理者链进行发送&#xff0c;使多个对象都可以处理请求&#xff0c;每个对象有权决定处理或传递给下个节点。 客户端&#xff1a;用来定义职责链条。 处理者&#xff1a;声明…

OpenCV 07(图像滤波器)

一、卷积 什么是图片卷积? 图像卷积就是卷积核在图像上按行滑动遍历像素时不断的相乘求和的过程 步长 步长就是卷积核在图像上移动的步幅. 上面例子中卷积核每次移动一个像素步长的结果, 如果将这个步长修改为2, 结果会如何? 为了充分扫描图片, 步长一般设为1. padding …

更换 yum 阿里源 - 手把手教你怎么配置,在也不需要求别人了 - 看懂一个就相当于看懂了其他的linux系统

更换阿里源 我的是centos8 当然 centos7 也可以换 后面有更详细的怎么配 &#xff0c;再也不用求别人怎么弄了 最直接的方式 直接复制 执行 centos7 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo或者 wget -O /etc/yum.repos.…

fastadmin 框架中图片点击放大

fastadmin的原生图片预览,重新打开一个窗口太麻烦&#xff0c;使用layui做一个弹窗式的图片预览 效果如下&#xff1a; 点击放大&#xff1a; 第一步&#xff1a;在backend-init.js文件中添加如下代码&#xff1a; $(body).on(click, [data-tips-image], function () {var…

Java进行多线程编程?(lambda表达式~)

本文标题&#xff1a;Java进行多线程编程&#xff1f;那么&#xff0c;Java为啥不学学如何进程多进程编程呢&#xff1f;&#xff1f;原因在于&#xff1a;Java圈子中不提倡多进程编程~~ 接下来&#xff0c;我们来写一个最为基础/入门的HelloWord程序来感受如何进行多线程~~ J…

leetcode:58. 最后一个单词的长度

题目&#xff1a; 函数原型&#xff1a; int lengthOfLastWord(char * s) 解析&#xff1a; 求最后一个单词的长度&#xff0c;我们有两种思路 第一种思路&#xff1a; 逆向求&#xff0c;先设置一个字符串下标index&#xff0c;定位到最后一个单词的最后一个字符。再一个设置长…

微服务-kubernetes安装

文章目录 一、前言二、kubernetes2.1、Kubernetes (K8S) 是什么2.1.1、主要特性&#xff1a;2.2.2、传统部署方式&#xff1a;2.2.3、虚拟机部署2.2.4容器部署2.2.5什么时候需要 Kubernetes2.2.6、Kubernetes 集群架构 三、kubernetes安装3.1、主节点需要组件3.1.1、设置对应主…

Mybatis传递实体对象只能直接获取,不能使用对象.属性方式获取

mybatis的自动识别参数功能很强大&#xff0c;pojo实体类可以直接写进mapper接口里面&#xff0c;不需要在mapper.xml文件中添加paramType,但是加了可以提高mybatis的效率 不加Param注解&#xff0c;取值的时候直接写属性 //这里是单参数&#xff0c;可以不加param&#xff01…

Node.js 操作百度网盘实现文件上传(小文件上传,大文件分片上传)

Node.js 操作百度网盘实现文件上传&#xff08;小文件上传&#xff0c;大文件分片上传&#xff09; 前提准备&#xff1a;获取百度网盘的授权码 https://pan.baidu.com/union/doc/al0rwqzzl const fs require(fs); const crypto require(crypto); const path require(pat…

扫地僧万能HTML模板站群:打造高效便捷的网站建设利器

扫地僧万能HTML模板站群是一款功能强大的网站建设工具&#xff0c;以其独特的特点和卓越的性能在网络开发领域广受赞誉。本文将介绍扫地僧万能HTML模板站群的几大特点&#xff0c;包括模板自动处理、一站管理、泛站独立、多套模板、蜘蛛统计、超强自定义、超强负载、简单高效、…

Achronix与您相约“2023全球AI芯片峰会”

2023全球AI芯片峰会&#xff08;GACS 2023&#xff09;将于9月14-15日在深圳市深圳湾万丽酒店举行。峰会由智一科技旗下芯东西联合智猩猩&#xff08;智东西公开课全新品牌&#xff09;联合发起主办&#xff0c;以「AI大时代 逐鹿芯世界」为主题。 届时&#xff0c;Achronix将…

【docker快速部署微服务若依管理系统(RuoYi-Cloud)】

工作原因&#xff0c;需要一个比较完整的开源项目测试本公司产品。偶然发现RuoYi-Cloud非常适合&#xff0c;它有足够多的中间件&#xff0c;而且官方提供docker安装&#xff0c;但我本人在安装过程中遇到了很多坑&#xff0c;在这里记录一下防止下次会再次遇到。 项目地址 ht…

表单引擎的自定义控件的概念与设计

基本概念 概述 控件的定义&#xff1a;用于展示或者采集数据的表单元素&#xff0c;称为控件,比如&#xff1a;文本框、下拉框、单选按钮、从表等.自定义控件&#xff1a;表单引擎提供的基础控件之外的控件称为自定义控件, 这些控件由开发人员自己定义&#xff0c;比如&#…

导入jdk源码并进行使用

jdk下载地址 JDK1.8源码下载地址 idea打开jdk项目 打开项目结构&#xff0c;进入SDK这一栏&#xff0c;选择一个使用的jdk&#xff0c;选择jdk的类路径 将类路径进行删除&#xff0c;并且添加我们自己下载的jdk中的src文件夹到类路径

Nodejs+vue+mysql网上药店购药系统 9h2k5

本毕业设计的内容是设计并且实现一个基于vue.js框架的空巢老人购药系统。采用MYSQL为数据库开发平台&#xff0c;nodejs语言&#xff0c;网络信息服务作为应用服务器。空巢老人购药系统的功能已基本实现&#xff0c;主要用户、家属、养生知识、药品信息、身体信息等。 论文主要…

海外ASO优化之如何优化游戏应用

如果我们发布了一款手机游戏或者管理了一款手机游戏&#xff0c;那么需要确保我们的手机游戏对合适的人可见&#xff0c;目的是增加应用的下载量。 1、优化游戏元数据的关键词。 Apple和Google在应用商店中为我们提供有限的空间&#xff0c;来描述手机游戏及其优势。我们需要使…

安防监控/视频汇聚/云存储/AI视频智能算法引擎系统:遛狗检测算法详解

根据最新修订发布的《中华人民共和国动物防疫法》规定&#xff1a;遛狗不栓绳&#xff0c;养狗不办证、未定期接种疫苗等行为都是违法行为。作为一个合格的“铲屎官"出门遛狗一定要牵好狗绳&#xff0c;保护他人和爱犬的安全。但就算法律明文规定&#xff0c;还是有很多人…

Android SDK 上手指南||第十一章 虚拟与物理设备

第十一章 虚拟与物理设备 在之前的文章里&#xff0c;大家已经了解了Android项目当中的基本元素、接触了用户界面的设计以及数据存储方案。接下来&#xff0c;我们将一同探索如何在物理及虚拟设备上运行自己的应用程序并与之互动。在系列文章的下一篇中&#xff0c;我们将分步…