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 中:
- /Areas//Views/
- /Areas//Views/Shared
- /Views/Shared
- /Pages/Shared
Razer Page 中:
- 当前页面文件夹
- 当前页面的上一级文件夹
- /Shared
- /Pages/Shared
- /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
相关文章:
ASP.NET Core 中的 MVC架构
MVC 架构 MVC架构把 App 按照逻辑分成三层: Controllers,接收 http request,配合 model,通过http response 返回 view,尽量不做别的事Models, 负责业务逻辑,App 的状态,以及数据处理Views&…...
C# PSO 粒子群优化算法 遗传算法 随机算法 求解复杂方程的最大、最小值
复杂方程可以自己定义,以下是看别人的题目,然后自己来做 以下是计算结果 private void GetMinResult(out double resultX1, out double min){double x1, result;Random random1 new Random(DateTime.Now.Millisecond* DateTime.Now.Second);min 99999…...
网络协议从入门到底层原理学习(三)—— 路由
网络协议从入门到底层原理学习(三)—— 路由 1、简介 路由(routing)是指分组从源到目的地时,决定端到端路径的网络范围的进程 在不同网段之间转发数据,需要有路由器的支持 默认情况下,路由器…...
2023/9/6 -- C++/QT
一、输出流对象cout 1> 该对象是来自于ostream的类对象,功能上类似于printf函数 2> 该类对象本质上调用成员函数插入运算符重载函数 3> 输出数据时,无需使用格式控制符:%d、%c、%s。。。,直接输出即可 4> 换行使用…...
python爬虫,多线程与生产者消费者模式
使用队列完成生产者消费者模式使用类创建多线程提高爬虫速度 https://sc.chinaz.com/tupian/index.html https://sc.chinaz.com/tupian/index_2.html https://sc.chinaz.com/tupian/index_3.html from threading import Thread from queue import Queue import requests from b…...
WordPress 提示“此站点遇到了致命错误”的解决方法
WordPress 提示“此站点遇到了致命错误”的解决方法 WordPress 网站博客提示“此站点遇到了致命错误。”如何解决?今天老唐不幸遇到了这个问题,搜了一下解决方法,发现致命错误原因有很多,所以需要先打开 WordPress 的 WP_DEBUG 功…...
Vue3,Typescript中引用组件路径无法找到模块报错
是这么个事,我在vue3新创建的项目里,写了个组件叫headerIndex.vue,放到app.vue中import就会报错 路径肯定没写错,找到了解决方法,但是也没想明白为什么 解决方法如下 在vite-env.d.ts文件中加入 declare module &qu…...
科技成果鉴定之鉴定测试报告
鉴定测试 由于软件类科技成果的复杂、内部结构难以鉴别等特点,我们提供了软件类科技成果鉴定测试服务。软件类科技成果鉴定测试是依据其科研项目计划任务书或技术合同书,参照相应的国家标准对要申请鉴定的软件类科技成果进行的一种符合性测试࿰…...
NFTScan 浏览器正式版上线 2 周年!
NFTScan 成立于 2021 年 4 月份,总部位于香港。在 2021 年的 7 月份,NFTScan 团队对外发布了 NFTScan 浏览器公测版,并在同年的 9 月 4 号,对外发布了 NFTScan 浏览器正式版,同步启用了全球品牌域名:NFTSCA…...
为什么要使用Token
传统的session认证 我们知道,http协议是一种无状态的协议,这就意味着当用户向我们的应用提供了用户名和密码进行用户认证,那么在下一次登录的时候,用户还要再进行验证,因为根据http协议,浏览器并不知道是谁…...
前端面试的话术集锦第 8 篇:高频考点(JS性能优化 性能优化琐碎事)
这是记录前端面试的话术集锦第八篇博文——高频考点(JS性能优化 & 性能优化琐碎事),我会不断更新该博文。❗❗❗ 1. 从V8中看JS性能优化 注意:该知识点属于性能优化领域。 1.1 测试性能⼯具 Chrome已经提供了⼀个⼤⽽全的性能测试⼯具Audits。 点我们点击Audits后,可…...
【数据分析】Python:处理缺失值的常见方法
在数据分析和机器学习中,缺失值是一种常见的现象。在实际数据集中,某些变量的某些条目可能没有可用的值。处理缺失值是一个重要的数据预处理步骤。在本文中,我们将介绍如何在 Pandas 中处理缺失值。 我们将探讨以下内容: 什么是缺…...
“批量随机字母命名文件,轻松管理你的文件库“
你是否曾经遇到过文件命名混乱,难以管理的问题?为了解决这个问题,我们推出了一款全新的文件改名工具,它可以帮助你批量给文件名添加一个随机字母,让你的文件库更加有序、易于管理。 首先第一步,我们要进入…...
elasticsearch的数据聚合
聚合可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些统计功能的比数据库的sql要方便的多,而且…...
【网络编程·数据链路层】MAC帧/以太网协议/ARP协议/RARP协议
需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网,轻量型云服务器低至112元/年,新用户首次下单享超低折扣。 目录 一、MAC帧 1、IP地址和MAC地址的区别 2、MAC帧协议 3、MTU对IP协议的…...
算法:移除数组中的val的所有元素---双指针[2]
文章来源: https://blog.csdn.net/weixin_45630258/article/details/132689237 欢迎各位大佬指点、三连 1、题目: 给你一个数组 nums和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用…...
Python小知识 - Python爬虫进阶:如何克服反爬虫技术
Python爬虫进阶:如何克服反爬虫技术 爬虫是一种按照一定的规则,自动抓取网页信息的程序。爬虫也叫网页蜘蛛、蚂蚁、小水滴,是一种基于特定算法的自动化程序,能够按照一定的规则自动的抓取网页中的信息。爬虫程序的主要作用就是从一…...
SAP中的新旧事务码
SAP中的新旧事务码 SAP随着新版本的发布,我们知道sap已经更新了很多的程序和TCODE。sap提供了很多新的TCODE来替换旧的TCODE,新TCODE有很多的新特性和新功能。在这个这种情况下,很多旧TCODE就会被废弃。我们如何查找这个替换呢? …...
day3_C++
day3_C 思维导图用C的类完成数据结构 栈的相关操作用C的类完成数据结构 循环队列的相关操作 思维导图 用C的类完成数据结构 栈的相关操作 stack.h #ifndef STACK_H #define STACK_H#include <iostream> #include <cstring>using namespace std;typedef int datat…...
力扣题解(73. 矩阵置零),带注释
题目描述 链接:点我 题解 //法一 使用hashset记录有0的横纵坐标即可 class Solution {public void setZeroes(int[][] matrix) {HashSet<Integer> row new HashSet<Integer>();HashSet<Integer> col new HashSet<Integer>();for(int i 0;i <…...
SpringMVC应用
文章目录 一、常用注解二、参数传递2.1 基础类型String2.2 复杂类型2.3 RequestParam2.4.路径传参 PathVariable2.4 Json数据传参 RequestBody2.5 RequestHeader 三、方法返回值3.1 void3.2 Stringmodel3.3 ModelAndView 一、常用注解 SpringMVC是一个基于Java的Web框架&#…...
百度输入法全面升级,打造首个基于大模型的输入法原生应用
基于文心一言,百度输入法宣布全面升级,打造行业首个“基于大模型的输入法原生应用”,从“输入工具”全面转型为“AI创作工具”。 近日,百度文心一言正式向公众开放。基于文心一言,百度输入法宣布全面升级,打…...
如何解决GitHub 访问不了?小白教程
GitHub 是全球最大的代码开源平台,小伙伴们平时都喜欢在那里找一些优质的开源项目来学习,以提升自己的编程技能。 但是很多小白初探GitHub 发现访问不了,不能访问 通过一下方法绕过这堵墙,成功下载 GitHub 上的项目。过程非常简单…...
龙芯指令集LoongArch——学习笔记(1)
1 龙芯架构 PDF下载链接: https://www.loongson.cn/download/index 1.1 龙芯架构概述 龙芯架构具有 RISC 指令架构的典型特征。 它的指令长度固定且编码格式规整, 绝大多数指令只有两个源操作数和一个目的操作数, 采用 load/store 架构&…...
ubuntu 20.04 docker安装emqx 最新版本或指定版本
要在Ubuntu 20.04上使用Docker安装EMQX(EMQ X Broker)的4.4.3版本,您可以执行以下步骤: 1.更新系统包列表: sudo apt update2.安装Docker: sudo apt install docker.io3.启动Docker服务并设置其开机自启…...
软件测试/测试开发丨学会与 AI 对话,高效提升学习效率
点此获取更多相关资料 简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中,沟通本来就是很重要的一门课程,沟通的过程中表达越清晰,给到的信息越多,那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理&…...
CEF内核和高级爬虫知识
(转)关于MFC中如何使用CEF内核(CEF初解析) Python GUI: cefpython3的简单分析和应用 cefpython3:一款强大的Python库 开始大多数抓取尝试可以从几乎一行代码开始: fun main() PulsarContexts.createSession().scrapeOutPages(&q…...
视频集中存储/云存储/磁盘阵列EasyCVR平台分组批量绑定/取消设备功能详解
安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台视频能力丰富灵活,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。视频汇聚融合管理平台EasyCVR既具备传…...
科技成果鉴定测试报告一般包含哪些测试内容?
软件测评报告 一、科技成果评价是需要做第三方软件测评报告,一般是证明技术指标点是否完善,覆盖主要申报内容,应用软件项目科技成果鉴定测试内容: (一)是否完成合同或计划任务书要求的指标; …...
IDEA中的“Deployment“ 将项目直接部署到服务器上
ntelliJ IDEA中的"Deployment"工具栏是一个方便的工具,用于将你的项目直接部署到服务器上。这个工具栏提供了三种部署的方式: 1.Web Server在本地电脑上,并且服务器运行目录也在项目目录下。 2.Web Server在本地电脑上,…...
布料市场做哪个网站好/百度账号登录入口
慕少森stdio.h 哪些 是 头文件,里面包含一些常用的 函数例如 stdio.h里面有 scanf();printf()这些函数,没有stdio就不能用这些函数在C语言家族程序中,头文件被大量使用。一般而言,每个C/C程序通常由头文件(header files)和定义文件…...
完全不收费的聊天软件/seo评测论坛
《支持向量机(SVM)多分类matlab程序代码》由会员分享,可在线阅读,更多相关《支持向量机(SVM)多分类matlab程序代码(2页珍藏版)》请在读根文库上搜索。1、%模型训练及数据整理model_12svmtrain(class_12_label,class_12_value);model_13svmtrain(class_13…...
wordpress wending/搜狗收录
[原创]浅谈测试环境管理方式 来新公司已经有一段时间了,刚来时对公司目前环境管理的方式不是很理解,也有众多疑问,其实现在我个人的看法,绝得目前现在所采用的环境管理方式,不是很好,原因有多方面ÿ…...
酷万网站建设/关键词竞价广告
亲测验证适用于5.7.10 1. 获得二进制文件 wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz 2. 加压到 /usr/local/mysql 目录(或者解压到当前目录然后做软链接到/usr/local/mysql)mkdir /usr/local/mysqltar -xvf mysql-5.7.10-linu…...
计算机网站建设与开发/搜索引擎google
谢谢dudu给大家提供了这么好的一个技术和思想交流的场所,我本来开个帐号是用来和其他人沟通而已,但是发现有空整理一下思路,突然发现有太多要整理的了,三十多年怎么能没有一点看法呢?于是经常在坐车时总结、构思。已经…...
移动网站建设服务商/萝卜建站
Spark插入MongoDB出现的错误 解决方案: 1.确认是否在spark中配置了相关的库和表 2.检测是否出现1个以上的spark(我之前检查过配置都没有问题,demo也可以跑,但是我的离线用户画像却一直插入不进去。 仔细检查发现,我写了个sparkSession&am…...